@razorwind/tamagui 0.0.40 → 0.0.41

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,5 +1,8 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});let e=require("@razorwind/core/plugin"),t=require("@razorwind/core/lib/fonts"),n=require("@razorwind/core/utils"),r=require("node:path");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,t){if(typeof e==`number`)return e;if(typeof e==`boolean`)return Number(e);if((0,n.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 String(e)}const s=[{prefix:/^(?:color|colours?|palette)\b/i,category:`color`},{prefix:/^(?:space|spacing|gap|inset)\b/i,category:`space`},{prefix:/^(?:size|sizing)\b/i,category:`size`},{prefix:/^(?:radius|rounded|radii)\b/i,category:`radius`},{prefix:/^(?:z-?index|zindex|elevation)\b/i,category:`zIndex`}];function c(e){return`$value`in e||`value`in e||`$ref`in e||`ref`in e}function l(e){return e===!0||e===`true`||e===1}function u(e){return l(e.palette)||l(e.$palette)?!0:p(e)===`palette`}function d(e,t){return(e===`palette`||e===`$palette`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function f(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function p(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function m(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 h(e,t){for(let{prefix:t,category:n}of s)if(t.test(e))return n;if(t===`color`||t===`palette`)return`color`;if(t===`dimension`){if(/space|spacing|gap|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|width|height/i.test(e))return`size`}if(t===`number`&&/z-?index|elevation/i.test(e))return`zIndex`}function g(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 _(e){let t=e.split(`.`).filter(Boolean),n=t[0];n&&/^(?:color|colours?|palette|space|spacing|gap|inset|size|sizing|radius|rounded|radii|z-?index|zindex|elevation)$/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`:g(r)}function v(e,t,r,i,a,s){if(!(0,n.isObject)(e))return;let l=a||u(e),g=p(e,r);if(c(e)){let r=m(e),a=t.join(`.`),c=h(a,g)??(l||g===`palette`?`color`:void 0),u=(0,n.formatTokenValue)(r,g),d=c===`color`||g===`color`||g===`palette`?u:o(r,g);s.push({path:a,type:g===`palette`?`color`:g,value:r,cssValue:u,tamaguiValue:d,category:c,tokenKey:c?_(a):void 0,description:f(e),theme:i,palette:l||void 0});return}for(let[n,r]of Object.entries(e))n.startsWith(`$`)&&n!==`$palette`||d(n,r)||v(r,[...t,n],g,i,l,s)}function y(e,t={}){let r=t.includeTypes?new Set(t.includeTypes):void 0,i=[];for(let t of(0,n.resolveTokenSets)(e)){let e=t.id==="default"?void 0:t.id;v(t.tokens,[],void 0,e,!1,i)}return r?i.filter(e=>!e.type||r.has(e.type)):i}function b(e){return`# Installing Tamagui Config
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`]),ee=[{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 h(e){return`$value`in e||`value`in e||`$ref`in e||`ref`in e}function g(e){return e===!0||e===`true`||e===1}function _(e){return g(e.palette)||g(e.$palette)?!0:y(e)===`palette`}function te(e,t){return(e===`palette`||e===`$palette`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function v(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function y(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function b(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 x(e,t){for(let{prefix:t,category:n}of ee)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 S(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 C(e){let t=e.split(`.`).filter(Boolean),n=t[0];n&&/^(?:color|colours?|palette|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`:S(r)}function w(e,n,r,i,a,s){if(!(0,t.isObject)(e))return;let c=a||_(e),l=y(e,r);if(h(e)){let r=b(e),a=n.join(`.`),u=x(a,l)??(c||l===`palette`?`color`:void 0),d=(0,t.formatTokenValue)(r,l),f=u&&m.has(u)||l===`color`||l===`palette`||l===`shadow`?d:o(r,l);s.push({path:a,type:l===`palette`?`color`:l,value:r,cssValue:d,tamaguiValue:f,category:u,tokenKey:u?C(a):void 0,description:v(e),theme:i,palette:c||void 0});return}for(let[t,r]of Object.entries(e))t.startsWith(`$`)&&t!==`$palette`||te(t,r)||w(r,[...n,t],l,i,c,s)}function T(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;w(n.tokens,[],void 0,e,!1,i)}return r?i.filter(e=>!e.type||r.has(e.type)):i}const E=/^\{([^{}]+)\}$/,D=/^(?:typography|type|text)$/i,ne=/^(?:font|fonts|font-family|fontFamily)$/i,re=/^(?:font-size|fontSize)$/i,ie=/^(?:font-weight|fontWeight)$/i,ae=/^(?:line-height|lineHeight|leading)$/i,oe=/^(?:letter-spacing|letterSpacing|tracking)$/i,se=/^(?:[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,ce=[`fontFamily`,`font-family`,`family`],le=[`fontSize`,`font-size`,`size`],ue=[`fontWeight`,`font-weight`,`weight`],de=[`lineHeight`,`line-height`,`leading`],fe=[`letterSpacing`,`letter-spacing`,`tracking`],pe={1:12,2:14,3:16,4:18,5:20,6:24,7:28,8:32,9:40,10:48};function O(e){if(typeof e==`string`)return E.exec(e.trim())?.[1]?.trim()}function k(e,t){let n=O(e);if(!n)return e;let r=t.get(n),i=new Set([n]);for(let e=0;e<8&&r;e++){let e=O(r.value);if(!e||i.has(e))return r.value;i.add(e),r=t.get(e)}return r?.value??e}function A(e,t){for(let n of t)if(e[n]!==void 0&&e[n]!==null)return e[n]}function me(e){return(e.split(`,`)[0]?.trim()??e).replaceAll(/^["']|["']$/g,``)}function he(e){if(typeof e==`string`){let t=e.trim();return t.length===0||O(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 ge(e){return Number.isInteger(e)?e:Math.round(e*1e3)/1e3}function j(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 _e(e){if(typeof e==`number`&&Number.isFinite(e))return String(e);if(typeof e==`string`){let t=e.trim();if(t.length===0||O(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 ve(e,t){let n=j(e);if(n!=null)return ge(t!=null&&n>0&&n<=4?n*t:n)}function M(e,t){return t.test(e.split(`.`)[0]??``)}function ye(e){return e.split(`.`).filter(Boolean).at(-1)??e}function N(e,t){let n=e.split(`.`).filter(Boolean);return n[0]&&t.test(n[0])&&n.shift(),n}function P(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 F(e){switch(e.toLowerCase()){case`heading`:case`title`:case`display`:return`heading`;case`mono`:case`monospace`:case`caption`:case`code`:return`mono`;case`sans`:case`body`:case`serif`:return`body`;default:return P([e])}}function be(e){return e.role?F(e.role):F(e.name)}function xe(e){let t=N(e,D);if(t.length===0)return`body`;let n=t.at(-1);return n&&t.length>=2&&se.test(n)&&!n.includes(`_`)?`${P(t.slice(0,-1))}_${n}`:P(t)}function Se(e){return F(N(e,ne)[0]??ye(e))}function I(e,t){let n=N(e,t);return n.length===0||n.length===1&&/^(?:DEFAULT|default)$/i.test(n[0])?`true`:P(n)}function Ce(e){return e.type===`typography`&&(0,t.isObject)(e.value)}function we(e){return e.category===`fontSize`||e.category===`fontWeight`||Te(e)||Ee(e)||De(e)||Oe(e)?!1:e.type===`fontFamily`||M(e.path,ne)}function Te(e){return e.category===`fontSize`||M(e.path,re)}function Ee(e){return e.category===`fontWeight`||e.type===`fontWeight`||M(e.path,ie)}function De(e){return M(e.path,ae)}function Oe(e){return M(e.path,oe)}function ke(e){let t=new Map;for(let n of Object.values(e)){let e=be(n),r=t.get(e);(!r||n.role===e&&r.role!==e)&&t.set(e,n)}return t}function Ae(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=me(t).toLowerCase();return i.find(e=>(0,r.fontFamilyName)(e).toLowerCase()===a||e.title.toLowerCase()===a||e.name.toLowerCase()===a)}function je(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 L(e,t){return{...e,webFamily:(0,r.cssFontFamily)(t),nativeFamily:(0,r.fontFamilyName)(t),face:t.source===`local`?je(t):e.face}}function R(e){return{key:e,webFamily:`system-ui, sans-serif`,nativeFamily:`system-ui`,size:{},lineHeight:{},weight:{},letterSpacing:{}}}function Me(e,t){return{...e,webFamily:t,nativeFamily:me(t)}}function Ne(e,t){let n={},r=[],i={},a={};for(let o of e){if(Te(o)){let e=j(k(o.value,t));e!=null&&(n[I(o.path,re)]=e);continue}if(Ee(o)){let e=_e(k(o.value,t));e&&(i[I(o.path,ie)]=e);continue}if(Oe(o)){let e=j(k(o.value,t));e!=null&&(a[I(o.path,oe)]=e);continue}De(o)&&r.push({key:I(o.path,ae),value:k(o.value,t)})}let o=n.true??n.base??Object.values(n)[0],s={};for(let e of r){let t=n[e.key]??o,r=ve(e.value,t);r!=null&&(s[e.key]=r)}return{size:n,lineHeight:s,weight:i,letterSpacing:a}}function z(e,t){return{...t,...e}}function B(e,t){return{...e,size:z(e.size,t.size),lineHeight:z(e.lineHeight,t.lineHeight),weight:z(e.weight,t.weight),letterSpacing:z(e.letterSpacing,t.letterSpacing)}}function Pe(e){return Object.keys(e.size).length>0?e:{...e,size:{...pe}}}function Fe(e,n,r,i){if(!(0,t.isObject)(n.value))return e;let a=A(n.value,ce),o=O(a),s=he(k(a,r)),c=Ae(i,s,o),l=e;c?l=L(l,c):s&&(l=Me(l,s));let u=j(k(A(n.value,le),r));u!=null&&(l={...l,size:{...l.size,true:u}});let d=_e(k(A(n.value,ue),r));d&&(l={...l,weight:{...l.weight,true:d}});let f=j(k(A(n.value,fe),r));f!=null&&(l={...l,letterSpacing:{...l.letterSpacing,true:f}});let p=ve(k(A(n.value,de),r),l.size.true??u);return p!=null&&(l={...l,lineHeight:{...l.lineHeight,true:p}}),l}function Ie(e,t){let n=new Map(e.map(e=>[e.path,e])),r=Ne(e,n),i=new Map,a=e=>{i.set(e.key,e)};if(t)for(let[e,n]of ke(t))a(B(L(R(e),n),r));for(let o of e){if(!we(o)||Ce(o))continue;let e=Se(o.path),s=he(k(o.value,n)),c=i.get(e)??R(e),l=Ae(t,s,o.path),u=c;l?u=L(u,l):(s&&c.webFamily===R(e).webFamily||s&&!i.has(e))&&(u=Me(u,s)),a(B(u,r))}for(let o of e){if(!Ce(o))continue;let e=xe(o.path);a(Fe(B(i.get(e)??R(e),r),o,n,t))}return[...i.values()].map(Pe).toSorted((e,t)=>e.key.localeCompare(t.key))}function Le(e){return/^\d+$/.test(e)||/^[A-Z_$][\w$]*$/i.test(e)?e:a(e)}function V(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}${Le(e)}: ${a(t)}`).join(`,
4
+ `)}\n${r}}`}function Re(e,t){let n=`${e.replaceAll(/\W/g,``)||`font${t}`}Font`;return/^[A-Z_]/i.test(n)?n:`font${t}`}function ze(e,t){let n=[` family: isWeb ? ${a(e.webFamily)} : ${a(e.nativeFamily)}`,` size: ${V(e.size)}`];return Object.keys(e.lineHeight).length>0&&n.push(` lineHeight: ${V(e.lineHeight)}`),Object.keys(e.weight).length>0&&n.push(` weight: ${V(e.weight)}`),Object.keys(e.letterSpacing).length>0&&n.push(` letterSpacing: ${V(e.letterSpacing)}`),e.face&&n.push(` face: ${e.face}`),`const ${t} = createFont({\n${n.join(`,
5
+ `)}\n});`}function Be(e){return`# Installing Tamagui Config
3
6
 
4
7
  Generated by \`@razorwind/tamagui\`.
5
8
 
@@ -32,26 +35,32 @@ export function App() {
32
35
  }
33
36
  \`\`\`
34
37
 
35
- 3. Use token props such as \`color="$primary"\` or \`padding="$sm"\` per your generated token map.
38
+ 3. Use generated tokens with Tamagui style props
39
+ ([styles](https://tamagui.dev/docs/intro/styles), [tokens](https://tamagui.dev/docs/core/tokens)):
40
+
41
+ - \`color="$primary"\` / \`padding="$sm"\` / \`borderRadius="$md"\`
42
+ - \`fontFamily="$body"\` / \`fontSize="$true"\` / \`fontWeight="$bold"\`
43
+ - Language variants: \`<FontLanguage body="cn">\` when a \`body_cn\` font is generated
44
+ - \`boxShadow="$shadow.sm"\` / \`boxShadow="$insetShadow.xs"\`
45
+ - \`textShadow="$textShadow.sm"\`
46
+ - \`filter="$dropShadow.sm"\`
36
47
 
37
48
  ## Regenerate
38
49
 
39
50
  Re-run Razorwind generate when tokens change so \`${e.outputPath}\` stays aligned with your design system.
40
- `}const x=new Set([`default`,`light`,`theme`]),S=/^base(?:[A-Z]\w*|[._-].+)?$/i,C=[`base`,`gray`,`grey`,`neutral`],w={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function T(e){return x.has(e)}function E(e){return e===`dark`}function D(e,t){let n=new Map,r=t===`dark`?E:T;for(let t of e){let e=t.theme?.toLowerCase();(!e||S.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 ee(e){let t={};for(let n of e){if(!n.category||!n.tokenKey)continue;let e=t[n.category]??{};e[n.tokenKey]=n.tamaguiValue,t[n.category]=e}return t}function O(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=/^[A-Z_$][\w$]*$/i.test(e)?e:a(e);return`${n}${r}: ${a(t)}`}).join(`,
41
- `)}\n${` `.repeat(Math.max(t-2,0))}}`}function k(e){if(e>=1&&e<=12)return e;if(e>=100&&e<=900&&e%100==0)return e/100}function A(e){let t=e.path.split(`.`).filter(Boolean),n=t.at(-1);if(n&&/^\d+$/.test(n)){let e=k(Number(n)),r=t.at(-2);if(e!=null&&r&&!/^(?:color|colours?|palette)$/i.test(r))return{name:g([r]),step:e}}if(!e.tokenKey)return;let r=/^([A-Z]+)(\d{1,3})$/i.exec(e.tokenKey);if(!r)return;let[,i=``,a=``]=r,o=k(Number(a));if(o!=null)return{name:i,step:o}}function j(e,t,n,r){let i=e[t]??{};i[`${t}${n}`]=r,e[t]=i}function M(e){let t={};for(let n of e){if(typeof n.tamaguiValue!=`string`)continue;let e=A(n);e&&j(t,e.name,e.step,n.tamaguiValue)}return Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=3))}function N(e){let t={};for(let n of e){if(!n.palette||typeof n.tamaguiValue!=`string`)continue;let e=A(n);e&&j(t,e.name,e.step,n.tamaguiValue)}let n=Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=2));return Object.keys(n).length>0?n:M(e)}function P(e,t){if(e.length<2)return[...e];let n=B(e[0]),r=B(e[e.length-1]);if(n==null||r==null||n===r)return[...e];let i=n>r;return t===`light`?i?[...e]:e.toReversed():i?e.toReversed():[...e]}function F(e){return e<=.04045?e/12.92:((e+.055)/1.055)**2.4}function I(e){let t=e.startsWith(`#`)?e.slice(1):``;if((t.length===3||t.length===4)&&(t=[...t].map(e=>e+e).join(``)),t.length===8&&(t=t.slice(0,6)),t.length!==6||/[^0-9a-f]/i.test(t))return;let n=Number.parseInt(t.slice(0,2),16)/255,r=Number.parseInt(t.slice(2,4),16)/255,i=Number.parseInt(t.slice(4,6),16)/255;return .2126*F(n)+.7152*F(r)+.0722*F(i)}function L(e){let t=e.trim();if(t.endsWith(`%`)){let e=Number.parseFloat(t);return Number.isFinite(e)?e/100:void 0}let n=Number.parseFloat(t);return Number.isFinite(n)?n:void 0}function R(e){return e>1?e/100:e}function z(e,t){let n=RegExp(`^${t}\\((.+)\\)$`,`i`).exec(e.trim());if(n?.[1])return n[1].split(/[\s,/]+/).filter(Boolean)}function B(e){let t=e.trim();if(!t||t.startsWith(`var(`)||t.includes(`{`))return;let n=I(t);if(n!=null)return n;let r=z(t,`oklch`);if(r?.[0]){let e=L(r[0]);return e==null?void 0:R(e)}let i=z(t,`hsla?`);if(i?.[2]){let e=L(i[2]);return e==null?void 0:R(e)}let a=z(t,`rgba?`);if(a?.[0]&&a[1]&&a[2]){let e=L(a[0]),t=L(a[1]),n=L(a[2]);if(e==null||t==null||n==null)return;let r=(e,t)=>t.trim().endsWith(`%`)||e<=1?e:e/255;return .2126*F(r(e,a[0]))+.7152*F(r(t,a[1]))+.0722*F(r(n,a[2]))}}function V(e,t){let n=[],r=t.toLowerCase();for(let[i,a]of Object.entries(e)){if(!i.toLowerCase().startsWith(r))continue;let e=i.slice(t.length);/^\d+$/.test(e)&&n.push([Number(e),a])}return n.sort(([e],[t])=>e-t),n}function H(e,t,n){let r=V(e,t);if(r.length===0)return e;let i=P(r.map(([,e])=>e),n),a={};for(let[e,[n]]of r.entries())a[`${t}${n}`]=i[e]??r[e][1];return a}function te(e){if(e.length>=12)return e.slice(0,12);let t=[...e],n=t.at(-1);if(n==null)return t;for(;t.length<12;)t.push(n);return t}function U(e,t,n){let r=V(e,t);if(!(r.length<2))return te(P(r.map(([,e])=>e),n))}function W(e,t){let n=new Map(Object.entries(e).map(([e,t])=>[e.toLowerCase(),{name:e,scale:t}]));for(let e of C){let r=n.get(e);if(!r)continue;let i=U(r.scale,r.name,t);if(i)return i}}function G(e){let t=e.filter(e=>e.category===`color`||e.palette),n=N(D(t,`light`)),r=N(D(t,`dark`));return{lightPalette:W(n,`light`),darkPalette:W(r,`dark`)}}function K(e){let t=N(e),n={};for(let r of e)r.category!==`color`||!r.tokenKey||typeof r.tamaguiValue!=`string`||r.palette||/^[A-Z]+\d{1,3}$/i.test(r.tokenKey)&&t[r.tokenKey.replace(/\d{1,3}$/,``)]||(n[r.tokenKey]=r.tamaguiValue);return n}function q(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);if(n.size===0)return;let r=[];for(let i of[...n].toSorted((e,t)=>e.localeCompare(t))){let n=H(e[i]??t[i]??{},i,`light`),a=H(t[i]??e[i]??{},i,`dark`);Object.keys(n).length!==0&&Object.keys(a).length!==0&&r.push(` ${i}: {
42
- light: ${O(n,8)},
43
- dark: ${O(a,8)}
51
+ `}const Ve=new Set([`default`,`light`,`theme`]),He=/^base(?:[A-Z]\w*|[._-].+)?$/i,Ue=[`base`,`gray`,`grey`,`neutral`],We={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function Ge(e){return Ve.has(e)}function Ke(e){return e===`dark`}function H(e,t){let n=new Map,r=t===`dark`?Ke:Ge;for(let t of e){let e=t.theme?.toLowerCase();(!e||He.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()]}const qe=new Set([`fontSize`,`blur`]),Je=[`space`,`size`,`radius`,`zIndex`,`blur`,`fontSize`,`shadow`,`insetShadow`,`dropShadow`,`textShadow`,`boxShadow`,`fontWeight`];function Ye(e){return/^px\(-?\d/.test(e)}function Xe(e){if(e.category===`radius`&&e.tokenKey?.startsWith(`borderRadius`)){let t=e.tokenKey.replace(/^borderRadius/,``);return t?S([t]):e.tokenKey}return e.tokenKey??``}function Ze(e){return e.category&&qe.has(e.category)&&typeof e.tamaguiValue==`number`?`px(${e.tamaguiValue})`:e.category===`dropShadow`&&typeof e.tamaguiValue==`string`?Qe(e.tamaguiValue):e.tamaguiValue}function Qe(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 $e(e){let t={};for(let n of e){if(!n.category||n.category===`color`||!n.tokenKey)continue;let e=Xe(n);if(!e)continue;let r=t[n.category]??{};r[e]=Ze(n),t[n.category]=r}return t}function et(e,t){let n={},r=(e,t)=>{let r=t.cssValue;typeof r!=`string`||r.length===0||G(r)||r===`[object Object]`||(n[e]=r)},i=e=>{let t=e.path.replace(/^color\./i,``).replaceAll(`.`,``);return e.theme?`${e.theme}_${t}`:t};for(let t of e)t.tokenKey&&(t.palette?r(i(t),t):r(t.tokenKey,t));for(let e of t)!e.tokenKey||!e.palette||r(i(e),e);return n}function U(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`&&Ye(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 tt(e,t=2){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${n}...theme\n${r}}`:`{\n${n}...theme,\n${i.map(([e,t])=>`${n}${/^[A-Z_$][\w$]*$/i.test(e)?e:a(e)}: ${t}`).join(`,
53
+ `)}\n${r}}`}const nt=/^\{([^{}]+)\}$/,rt=/^var\((--[^),\s]+)(?:\s*,[^)]*)?\)$/;function it(e){if(typeof e==`string`)return nt.exec(e.trim())?.[1]?.trim()}function W(e){if(typeof e==`string`)return rt.exec(e.trim())?.[1]}function G(e){return it(e)!=null||W(e)!=null}function at(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=it(r.value);if(e){let n=t.get(e);if(!n||n.path===r.path)return r;r=n;continue}let a=W(r.value)??W(r.cssValue)??W(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 ot(e){return/^[A-Z_$][\w$]*$/i.test(e)?`theme.${e}`:`theme[${a(e)}]`}function st(e,t,n){let r=K(e);if(r){if(t&&r.name.toLowerCase()===t.toLowerCase())return`color${r.step}`;if(n[r.name])return`${r.name}${r.step}`}}function ct(e){if(e>=1&&e<=12)return e;if(e>=100&&e<=900&&e%100==0)return e/100}function K(e){let t=e.path.split(`.`).filter(Boolean),n=t.at(-1);if(n&&/^\d+$/.test(n)){let e=ct(Number(n)),r=t.at(-2);if(e!=null&&r&&!/^(?:color|colours?|palette)$/i.test(r))return{name:S([r]),step:e}}if(!e.tokenKey)return;let r=/^([A-Z]+)(\d{1,3})$/i.exec(e.tokenKey);if(!r)return;let[,i=``,a=``]=r,o=ct(Number(a));if(o!=null)return{name:i,step:o}}function lt(e,t,n,r){let i=e[t]??{};i[`${t}${n}`]=r,e[t]=i}function ut(e){let t={};for(let n of e){if(typeof n.tamaguiValue!=`string`)continue;let e=K(n);e&&lt(t,e.name,e.step,n.tamaguiValue)}return Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=3))}function q(e){let t={};for(let n of e){if(!n.palette||typeof n.tamaguiValue!=`string`)continue;let e=K(n);e&&lt(t,e.name,e.step,n.tamaguiValue)}let n=Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=2));return Object.keys(n).length>0?n:ut(e)}function J(e,t){if(e.length<2)return[...e];let n=Q(e[0]),r=Q(e[e.length-1]);if(n==null||r==null||n===r)return[...e];let i=n>r;return t===`light`?i?[...e]:e.toReversed():i?e.toReversed():[...e]}function Y(e){return e<=.04045?e/12.92:((e+.055)/1.055)**2.4}function dt(e){let t=e.startsWith(`#`)?e.slice(1):``;if((t.length===3||t.length===4)&&(t=[...t].map(e=>e+e).join(``)),t.length===8&&(t=t.slice(0,6)),t.length!==6||/[^0-9a-f]/i.test(t))return;let n=Number.parseInt(t.slice(0,2),16)/255,r=Number.parseInt(t.slice(2,4),16)/255,i=Number.parseInt(t.slice(4,6),16)/255;return .2126*Y(n)+.7152*Y(r)+.0722*Y(i)}function X(e){let t=e.trim();if(t.endsWith(`%`)){let e=Number.parseFloat(t);return Number.isFinite(e)?e/100:void 0}let n=Number.parseFloat(t);return Number.isFinite(n)?n:void 0}function ft(e){return e>1?e/100:e}function Z(e,t){let n=RegExp(`^${t}\\((.+)\\)$`,`i`).exec(e.trim());if(n?.[1])return n[1].split(/[\s,/]+/).filter(Boolean)}function Q(e){let t=e.trim();if(!t||t.startsWith(`var(`)||t.includes(`{`))return;let n=dt(t);if(n!=null)return n;let r=Z(t,`oklch`);if(r?.[0]){let e=X(r[0]);return e==null?void 0:ft(e)}let i=Z(t,`hsla?`);if(i?.[2]){let e=X(i[2]);return e==null?void 0:ft(e)}let a=Z(t,`rgba?`);if(a?.[0]&&a[1]&&a[2]){let e=X(a[0]),t=X(a[1]),n=X(a[2]);if(e==null||t==null||n==null)return;let r=(e,t)=>t.trim().endsWith(`%`)||e<=1?e:e/255;return .2126*Y(r(e,a[0]))+.7152*Y(r(t,a[1]))+.0722*Y(r(n,a[2]))}}function pt(e,t){let n=[],r=t.toLowerCase();for(let[i,a]of Object.entries(e)){if(!i.toLowerCase().startsWith(r))continue;let e=i.slice(t.length);/^\d+$/.test(e)&&n.push([Number(e),a])}return n.sort(([e],[t])=>e-t),n}function mt(e,t,n){let r=pt(e,t);if(r.length===0)return e;let i=J(r.map(([,e])=>e),n),a={};for(let[e,[n]]of r.entries())a[`${t}${n}`]=i[e]??r[e][1];return a}function ht(e){if(e.length>=12)return e.slice(0,12);let t=[...e],n=t.at(-1);if(n==null)return t;for(;t.length<12;)t.push(n);return t}function gt(e,t,n){let r=pt(e,t);if(!(r.length<2))return ht(J(r.map(([,e])=>e),n))}function _t(e,t){let n=new Map(Object.entries(e).map(([e,t])=>[e.toLowerCase(),{name:e,scale:t}]));for(let e of Ue){let r=n.get(e);if(!r)continue;let i=gt(r.scale,r.name,t);if(i)return{name:r.name,palette:i}}}function vt(e){let t=e.filter(e=>e.category===`color`||e.palette),n=q(H(t,`light`)),r=q(H(t,`dark`)),i=_t(n,`light`),a=_t(r,`dark`);return{lightPalette:i?.palette,darkPalette:a?.palette,lightBaseName:i?.name,darkBaseName:a?.name}}function $(e,n){let r=q(e),i=new Map(e.map(e=>[e.path,e])),o=new Map(e.map(e=>[(0,t.toThemeCssVar)(e.path),e])),s={};for(let t of e){if(t.category!==`color`||!t.tokenKey||t.palette||/^[A-Z]+\d{1,3}$/i.test(t.tokenKey)&&r[t.tokenKey.replace(/\d{1,3}$/,``)])continue;let e=at(t,i,o),c=st(e,n,r);if(c){s[t.tokenKey]=ot(c);continue}let l=e.tamaguiValue;G(l)||G(e.cssValue)||(typeof l==`string`||typeof l==`number`)&&(s[t.tokenKey]=a(l))}return s}function yt(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);if(n.size===0)return;let r=[];for(let i of[...n].toSorted((e,t)=>e.localeCompare(t))){let n=mt(e[i]??t[i]??{},i,`light`),a=mt(t[i]??e[i]??{},i,`dark`);Object.keys(n).length!==0&&Object.keys(a).length!==0&&r.push(` ${i}: {
54
+ light: ${U(n,8)},
55
+ dark: ${U(a,8)}
44
56
  }`)}if(r.length!==0)return`{\n${r.join(`,
45
- `)}\n }`}function J(e){switch(e.role){case`heading`:case`display`:return`heading`;case`mono`:case`code`:return`mono`;case`sans`:case`body`:case`serif`:return`body`;case void 0:default:return e.name?.replaceAll(/\W/g,``)||`body`}}function Y(e){let t=new Map;for(let n of Object.values(e)){let e=J(n),r=t.get(e);(!r||n.role===e&&r.role!==e)&&t.set(e,n)}return t}function X(e){let t=new Map;for(let n of e.files){let e=String(n.weight??400),i=(0,r.basename)(n.path).replace(/\.[^.]+$/,``),a=t.get(e)??{};n.style===`italic`||n.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(`,
46
- `)}\n }`}function Z(e,n){let r=e.source===`local`?X(e):void 0,i=[`const ${n} = createFont({`,` family: isWeb ? ${a((0,t.cssFontFamily)(e))} : ${a((0,t.fontFamilyName)(e))},`,` size: {`,` 1: 12,`,` 2: 14,`,` 3: 16,`,` 4: 18,`,` 5: 20,`,` 6: 24,`,` 7: 28,`,` 8: 32,`,` 9: 40,`,` 10: 48`,` }${r?`,`:``}`];return r&&i.push(` face: ${r}`),i.push(`});`),i.join(`
47
- `)}function Q(e,t={},n){let r=t.useDefaultConfig!==!1,i=t.animations??`css`,o=t.includeTypeAugmentation!==!1,s=ee(D(e,`light`)),c=e.filter(e=>e.category===`color`),l=D(c,`light`),u=D(c,`dark`),d=N(l),f=N(u.length>0?u:l),{lightPalette:p,darkPalette:m}=G(e),h=q(d,f),g=K(l),_=K(u.length>0?u:l),v=Object.keys(g).length>0||Object.keys(_).length>0,y=[];for(let e of[`color`,`space`,`size`,`radius`,`zIndex`]){let t=s[e];t&&Object.keys(t).length>0&&y.push(` ${e}: ${O(t,4)}`)}let b=[];p&&b.push(` lightPalette: ${a(p)}`),m&&b.push(` darkPalette: ${a(m)}`),h&&b.push(` childrenThemes: ${h}`),v&&b.push(` getTheme: ({ scheme }) => {
48
- const semantic = scheme === "dark"
49
- ? ${O(_,8)}
50
- : ${O(g,8)};
51
- return semantic;
52
- }`);let x=[];r?x.push(`import { createV5Theme, defaultConfig } from "@tamagui/config/v5";`):x.push(`import { createV5Theme } from "@tamagui/config/v5";`),i!==!1&&x.push(`import { animations } from "${w[i]}";`);let S=[`createTamagui`];y.length>0&&S.push(`createTokens`);let C=n?Y(n):new Map;C.size>0&&S.push(`createFont`,`isWeb`),x.push(`import { ${S.join(`, `)} } from "tamagui";`);let T=[`/* eslint-disable */`,`/*`,` * Generated by @razorwind/tamagui — do not edit by hand.`,` * @see https://tamagui.dev/docs/core/config-v5`,` */`,``,...x,``];y.length>0&&T.push(`const tokens = createTokens({`,y.join(`,
53
- `),`});`,``);let E=b.length>0?`createV5Theme({\n${b.join(`,
54
- `)}\n})`:`createV5Theme()`;T.push(`const themes = ${E};`,``);let k=new Map;if(C.size>0){let e=0;for(let[t,n]of C){let r=`${t}Font`.replaceAll(/\W/g,``)||`font${e}`;k.set(t,r),T.push(Z(n,r),``),e+=1}}let A=[];if(r&&A.push(` ...defaultConfig`),i!==!1&&A.push(` animations`),y.length>0&&(r?A.push(` tokens: {
57
+ `)}\n }`}function bt(e,t={},n){let r=t.useDefaultConfig!==!1,i=t.animations??`css`,o=t.includeTypeAugmentation!==!1,s=e.filter(e=>e.category===`color`),c=H(s,`light`),l=H(s,`dark`),u=q(c),d=q(l.length>0?l:c),{lightPalette:f,darkPalette:p,lightBaseName:m,darkBaseName:ee}=vt(e),h=yt(u,d),g=$(c,m),_=$(l.length>0?l:c,l.length>0?ee:m),te=$e(H(e,`light`)),v=et(c,l),y=[];Object.keys(v).length>0&&y.push(` color: ${U(v,4)}`);for(let e of Je){let t=te[e];t&&Object.keys(t).length>0&&y.push(` ${e}: ${U(t,4)}`)}let b=[];f&&b.push(` lightPalette: ${a(f)}`),p&&b.push(` darkPalette: ${a(p)}`),h&&b.push(` childrenThemes: ${h}`),(Object.keys(g).length>0||Object.keys(_).length>0)&&b.push(` getTheme: ({ theme, scheme }: Parameters<CreateV5ThemeOptions["getTheme"]>[0]) => {
58
+ return scheme === "dark"
59
+ ? ${tt(_,8)}
60
+ : ${tt(g,8)};
61
+ }`);let x=[`import { isWeb } from '@tamagui/constants';`];r?x.push(`import { createV5Theme, defaultConfig, type CreateV5ThemeOptions } from "@tamagui/config/v5";`):x.push(`import { createV5Theme, type CreateV5ThemeOptions } from "@tamagui/config/v5";`),i!==!1&&x.push(`import { animations } from "${We[i]}";`);let S=[`createTamagui`,`px`];y.length>0&&S.push(`createTokens`);let C=Ie(H(e,`light`),n);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/config-v5`,` */`,``,...x,``];y.length>0&&w.push(`const tokens = createTokens({`,y.join(`,
62
+ `),`});`,``);let T=b.length>0?`createV5Theme({\n${b.join(`,
63
+ `)}\n})`:`createV5Theme()`;w.push(`const themes = ${T};`,``);let E=new Map;if(C.length>0)for(let[e,t]of C.entries()){let n=Re(t.key,e);E.set(t.key,n),w.push(ze(t,n),``)}let D=[];if(r&&D.push(` ...defaultConfig`),i!==!1&&D.push(` animations`),y.length>0&&(r?D.push(` tokens: {
55
64
  ...defaultConfig.tokens,
56
65
  ...tokens,
57
66
  color: {
@@ -74,13 +83,13 @@ Re-run Razorwind generate when tokens change so \`${e.outputPath}\` stays aligne
74
83
  ...defaultConfig.tokens.zIndex,
75
84
  ...tokens.zIndex
76
85
  }
77
- }`):A.push(` tokens`)),A.push(` themes`),k.size>0){let e=[...k.entries()].map(([e,t])=>` ${e}: ${t}`);r?A.push(` fonts: {
86
+ }`):D.push(` tokens`)),D.push(` themes`),E.size>0){let e=[...E.entries()].map(([e,t])=>` ${/^[A-Z_$][\w$]*$/i.test(e)?e:a(e)}: ${t}`);r?D.push(` fonts: {
78
87
  ...defaultConfig.fonts,
79
88
  ${e.join(`,
80
89
  `)}
81
- }`):A.push(` fonts: {
90
+ }`):D.push(` fonts: {
82
91
  ${e.join(`,
83
92
  `)}
84
- }`)}return T.push(`export const config = createTamagui({`,A.join(`,
85
- `),`});`,``,`export type AppConfig = typeof config;`,``),o&&T.push(`declare module "tamagui" {`,` // eslint-disable-next-line @typescript-eslint/no-empty-object-type`,` interface TamaguiCustomConfig extends AppConfig {}`,`}`,``),T.push(`export default config;`,``),T.join(`
86
- `)}function $(e,t={}){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?y(e.tokens,t):[];if(o.length===0&&!a)return{};let s=t.outputPath??`tamagui.config.ts`,c=Q(o,t,e.fonts),l=t.installGuide??b({outputPath:s}),u=(0,r.join)((0,r.dirname)(s),`INSTALL.md`);return{[s]:(0,n.createDocument)(s,c,{name:`razorwind-tamagui`},!1,`typescript`),[u]:(0,n.createDocument)(u,l,{name:`razorwind-tamagui`},!1,`markdown`)}}var ne=(0,e.definePlugin)(e=>({name:`tamagui`,themeGeneration:`combined`,generate:async t=>$(t,e??{})}));exports.collectColorScales=N,exports.colorLightness=B,exports.default=ne,exports.flattenTokens=y,Object.defineProperty(exports,"formatTokenValue",{enumerable:!0,get:function(){return n.formatTokenValue}}),exports.generateTamaguiConfig=$,exports.isPaletteGroup=u,exports.orderPaletteForScheme=P,exports.renderInstallMd=b,exports.renderTamaguiConfig=Q,exports.resolveTokenCategory=h,exports.resolveTokenSets=n.resolveTokenSets,exports.toCamelCaseKey=g,Object.defineProperty(exports,"toCssVar",{enumerable:!0,get:function(){return n.toCssVar}}),exports.toTamaguiValue=o,exports.toTokenKey=_;
93
+ }`)}return w.push(`export const config = createTamagui({`,D.join(`,
94
+ `),`});`,``,`export type AppConfig = typeof config;`,``),o&&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(`
95
+ `)}function xt(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?T(e.tokens,r):[];if(o.length===0&&!a)return{};let s=r.outputPath??`tamagui.config.ts`,c=bt(o,r,e.fonts),l=r.installGuide??Be({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 St=(0,e.definePlugin)(e=>({name:`tamagui`,themeGeneration:`combined`,generate:async t=>xt(t,e??{})}));exports.collectColorScales=q,exports.collectTamaguiFonts=Ie,exports.colorLightness=Q,exports.default=St,exports.flattenTokens=T,exports.fontVarName=Re,Object.defineProperty(exports,"formatTokenValue",{enumerable:!0,get:function(){return t.formatTokenValue}}),exports.generateTamaguiConfig=xt,exports.isPaletteGroup=_,exports.orderPaletteForScheme=J,exports.renderInstallMd=Be,exports.renderTamaguiConfig=bt,exports.resolveTokenCategory=x,exports.resolveTokenSets=t.resolveTokenSets,exports.tamaguiFontKeyFromRole=F,exports.toCamelCaseKey=S,Object.defineProperty(exports,"toCssVar",{enumerable:!0,get:function(){return t.toCssVar}}),exports.toTamaguiValue=o,exports.toTokenKey=C,exports.typographyFontKey=xe;
package/dist/index.d.cts CHANGED
@@ -12,7 +12,7 @@ type TamaguiAnimationDriver = "css" | "rn" | "reanimated" | "motion" | false;
12
12
  /**
13
13
  * Tamagui `createTokens` category keys we emit from DTCG tokens.
14
14
  */
15
- type TamaguiTokenCategory = "color" | "space" | "size" | "radius" | "zIndex";
15
+ type TamaguiTokenCategory = "color" | "space" | "size" | "radius" | "zIndex" | "blur" | "fontSize" | "shadow" | "insetShadow" | "dropShadow" | "textShadow" | "fontWeight" | "boxShadow";
16
16
  /**
17
17
  * Options for the Razorwind Tamagui config generator.
18
18
  */
@@ -120,6 +120,51 @@ declare function toTokenKey(path: string): string;
120
120
  */
121
121
  declare function flattenTokens(tokens: Tokens | Record<string, Tokens>, options?: Pick<TamaguiPluginOptions, "includeTypes">): FlatToken[];
122
122
  //#endregion
123
+ //#region src/fonts.d.ts
124
+ /**
125
+ * A Tamagui `createFont` definition assembled from DTCG typography tokens,
126
+ * font-family tokens, and `spec.fonts`.
127
+ *
128
+ * @see https://tamagui.dev/docs/core/font-language#font-tokens
129
+ */
130
+ interface TamaguiFontDef {
131
+ /** Tamagui `fonts` object key (`body`, `heading`, `body_cn`, …). */
132
+ key: string;
133
+ /** CSS font-family stack used when `isWeb` is true. */
134
+ webFamily: string;
135
+ /** Family name used on native. */
136
+ nativeFamily: string;
137
+ size: Record<string, number>;
138
+ lineHeight: Record<string, number>;
139
+ weight: Record<string, string>;
140
+ letterSpacing: Record<string, number>;
141
+ /** Rendered `face` object literal for local fonts, when present. */
142
+ face?: string;
143
+ }
144
+ /**
145
+ * Map a font role / family token name onto Tamagui's `body` / `heading` /
146
+ * `mono` keys.
147
+ */
148
+ declare function tamaguiFontKeyFromRole(name: string): string;
149
+ /**
150
+ * Tamagui font key for a typography token. Nested language segments and
151
+ * `body_cn`-style names keep the `_` separator FontLanguage expects.
152
+ *
153
+ * @see https://tamagui.dev/docs/core/font-language
154
+ */
155
+ declare function typographyFontKey(path: string): string;
156
+ /**
157
+ * Build Tamagui font definitions from typography tokens, font-family tokens,
158
+ * and `spec.fonts`. Each resulting entry is emitted via `createFont`.
159
+ *
160
+ * @see https://tamagui.dev/docs/core/font-language#font-tokens
161
+ */
162
+ declare function collectTamaguiFonts(tokens: FlatToken[], fonts?: Fonts): TamaguiFontDef[];
163
+ /**
164
+ * Valid JS identifier used for the `const <name> = createFont(...)` binding.
165
+ */
166
+ declare function fontVarName(key: string, index: number): string;
167
+ //#endregion
123
168
  //#region src/format.d.ts
124
169
  /**
125
170
  * Convert a DTCG `$value` into a Tamagui token primitive.
@@ -164,8 +209,10 @@ declare function colorLightness(color: string): number | undefined;
164
209
  * Render a Tamagui v5 config module from flattened design tokens.
165
210
  *
166
211
  * Light and dark token sets are combined into one `createV5Theme` call.
212
+ * Typography and font-family tokens are emitted as `createFont` entries.
167
213
  *
168
214
  * @see https://tamagui.dev/docs/core/config-v5
215
+ * @see https://tamagui.dev/docs/core/font-language#font-tokens
169
216
  */
170
217
  declare function renderTamaguiConfig(tokens: FlatToken[], options?: TamaguiPluginOptions, fonts?: Fonts): string;
171
218
  /**
@@ -176,7 +223,7 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
176
223
  //#region src/index.d.ts
177
224
  /**
178
225
  * Razorwind plugin that turns design tokens into a Tamagui v5 config
179
- * (`createTamagui` + `createTokens` + `createV5Theme`).
226
+ * (`createTamagui` + `createTokens` + `createV5Theme` + `createFont`).
180
227
  *
181
228
  * Light and dark token sets are emitted as a single config: `createV5Theme`
182
229
  * receives both `lightPalette` / `darkPalette` and `childrenThemes` with
@@ -185,7 +232,12 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
185
232
  * set `lightPalette` / `darkPalette` (`color1`–`color12`). Light palettes are
186
233
  * ordered lightest-first; dark palettes darkest-first.
187
234
  *
235
+ * Typography tokens (`$type: "typography"`) and font-family tokens each emit
236
+ * a Tamagui `createFont` entry. Names with a `_` suffix (or a nested language
237
+ * segment) become FontLanguage variants (`body_cn`).
238
+ *
188
239
  * @see https://tamagui.dev/docs/core/config-v5
240
+ * @see https://tamagui.dev/docs/core/font-language#font-tokens
189
241
  *
190
242
  * @example
191
243
  * ```ts
@@ -199,5 +251,5 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
199
251
  */
200
252
  declare const _default: (options?: TamaguiPluginOptions | undefined) => import("@razorwind/core/plugin").Plugin;
201
253
  //#endregion
202
- export { type FlatToken, type TamaguiAnimationDriver, type TamaguiPluginOptions, type TamaguiTokenCategory, collectColorScales, colorLightness, _default as default, flattenTokens, formatTokenValue, generateTamaguiConfig, isPaletteGroup, orderPaletteForScheme, renderInstallMd, renderTamaguiConfig, resolveTokenCategory, resolveTokenSets, toCamelCaseKey, toCssVar, toTamaguiValue, toTokenKey };
254
+ export { type FlatToken, type TamaguiAnimationDriver, type TamaguiFontDef, type TamaguiPluginOptions, type TamaguiTokenCategory, collectColorScales, collectTamaguiFonts, colorLightness, _default as default, flattenTokens, fontVarName, formatTokenValue, generateTamaguiConfig, isPaletteGroup, orderPaletteForScheme, renderInstallMd, renderTamaguiConfig, resolveTokenCategory, resolveTokenSets, tamaguiFontKeyFromRole, toCamelCaseKey, toCssVar, toTamaguiValue, toTokenKey, typographyFontKey };
203
255
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/flatten.ts","../src/format.ts","../src/install.ts","../src/generate.ts","../src/index.ts"],"mappings":";;;;;;;;;;KAyBY;;;;KAMA;;;;UAMK;;;;;;;;;EASf;;;;;;;EAQA,aAAa;;;;;;;;EASb;;;;;EAMA,eAAe;;;;;;;EAQf;;;;;EAMA;;;;;UAMe;;EAEf;;EAEA,OAAO;;EAEP;;EAEA;;EAEA;;EAEA,WAAW;;EAEX;;EAEA;;EAEA;;;;;;EAMA;;;;;;;;;iBCxDc,eAAe,MAAM;;;;iBA2DrB,qBACd,cACA,gBACC;;;;;;;iBAuCa,eAAe;;;;;;;;iBA0Bf,WAAW;;;;iBAkFX,cACd,QAAQ,SAAS,eAAe,SAChC,UAAS,KAAK,wCACb;;;;;;;;;iBCnNa,eAAe,gBAAgB;;;;;;;;iBCnC/B,gBAAgB;EAAW;;;;KCiCtC;;;;;;;iBA0KW,mBACd,aAAa,cACZ,eAAe;;;;;;;iBAmCF,sBACd,2BACA,QAAQ;;;;;iBA+EM,eAAe;;;;;;;;iBAsWf,oBACd,QAAQ,aACR,UAAS,sBACT,QAAQ;;;;iBAuNM,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":";;;;;;;;;;KAyBY;;;;KAMA;;;;UAkBK;;;;;;;;;EASf;;;;;;;EAQA,aAAa;;;;;;;;EASb;;;;;EAMA,eAAe;;;;;;;EAQf;;;;;EAMA;;;;;UAMe;;EAEf;;EAEA,OAAO;;EAEP;;EAEA;;EAEA;;EAEA,WAAW;;EAEX;;EAEA;;EAEA;;;;;;EAMA;;;;;;;;;iBCpCc,eAAe,MAAM;;;;iBA2DrB,qBACd,cACA,gBACC;;;;;;;iBAoEa,eAAe;;;;;;;;iBA0Bf,WAAW;;;;iBAqFX,cACd,QAAQ,SAAS,eAAe,SAChC,UAAS,KAAK,wCACb;;;;;;;;;UCjQc;;EAEf;;EAEA;;EAEA;EACA,MAAM;EACN,YAAY;EACZ,QAAQ;EACR,eAAe;;EAEf;;;;;;iBAyLc,uBAAuB;;;;;;;iBAsCvB,kBAAkB;;;;;;;iBAkXlB,oBACd,QAAQ,aACR,QAAQ,QACP;;;;iBAuFa,YAAY,aAAa;;;;;;;;;iBCzsBzB,eAAe,gBAAgB;;;;;;;;iBCnC/B,gBAAgB;EAAW;;;;KCiCtC;;;;;;;iBA0cW,mBACd,aAAa,cACZ,eAAe;;;;;;;iBAmCF,sBACd,2BACA,QAAQ;;;;;iBA+EM,eAAe;;;;;;;;;;iBAsSf,oBACd,QAAQ,aACR,UAAS,sBACT,QAAQ;;;;iBA6NM,sBACd,MAAM,QACN,UAAS,uBACR,wBAAwB,QAAQ"}
package/dist/index.d.mts CHANGED
@@ -12,7 +12,7 @@ type TamaguiAnimationDriver = "css" | "rn" | "reanimated" | "motion" | false;
12
12
  /**
13
13
  * Tamagui `createTokens` category keys we emit from DTCG tokens.
14
14
  */
15
- type TamaguiTokenCategory = "color" | "space" | "size" | "radius" | "zIndex";
15
+ type TamaguiTokenCategory = "color" | "space" | "size" | "radius" | "zIndex" | "blur" | "fontSize" | "shadow" | "insetShadow" | "dropShadow" | "textShadow" | "fontWeight" | "boxShadow";
16
16
  /**
17
17
  * Options for the Razorwind Tamagui config generator.
18
18
  */
@@ -120,6 +120,51 @@ declare function toTokenKey(path: string): string;
120
120
  */
121
121
  declare function flattenTokens(tokens: Tokens | Record<string, Tokens>, options?: Pick<TamaguiPluginOptions, "includeTypes">): FlatToken[];
122
122
  //#endregion
123
+ //#region src/fonts.d.ts
124
+ /**
125
+ * A Tamagui `createFont` definition assembled from DTCG typography tokens,
126
+ * font-family tokens, and `spec.fonts`.
127
+ *
128
+ * @see https://tamagui.dev/docs/core/font-language#font-tokens
129
+ */
130
+ interface TamaguiFontDef {
131
+ /** Tamagui `fonts` object key (`body`, `heading`, `body_cn`, …). */
132
+ key: string;
133
+ /** CSS font-family stack used when `isWeb` is true. */
134
+ webFamily: string;
135
+ /** Family name used on native. */
136
+ nativeFamily: string;
137
+ size: Record<string, number>;
138
+ lineHeight: Record<string, number>;
139
+ weight: Record<string, string>;
140
+ letterSpacing: Record<string, number>;
141
+ /** Rendered `face` object literal for local fonts, when present. */
142
+ face?: string;
143
+ }
144
+ /**
145
+ * Map a font role / family token name onto Tamagui's `body` / `heading` /
146
+ * `mono` keys.
147
+ */
148
+ declare function tamaguiFontKeyFromRole(name: string): string;
149
+ /**
150
+ * Tamagui font key for a typography token. Nested language segments and
151
+ * `body_cn`-style names keep the `_` separator FontLanguage expects.
152
+ *
153
+ * @see https://tamagui.dev/docs/core/font-language
154
+ */
155
+ declare function typographyFontKey(path: string): string;
156
+ /**
157
+ * Build Tamagui font definitions from typography tokens, font-family tokens,
158
+ * and `spec.fonts`. Each resulting entry is emitted via `createFont`.
159
+ *
160
+ * @see https://tamagui.dev/docs/core/font-language#font-tokens
161
+ */
162
+ declare function collectTamaguiFonts(tokens: FlatToken[], fonts?: Fonts): TamaguiFontDef[];
163
+ /**
164
+ * Valid JS identifier used for the `const <name> = createFont(...)` binding.
165
+ */
166
+ declare function fontVarName(key: string, index: number): string;
167
+ //#endregion
123
168
  //#region src/format.d.ts
124
169
  /**
125
170
  * Convert a DTCG `$value` into a Tamagui token primitive.
@@ -164,8 +209,10 @@ declare function colorLightness(color: string): number | undefined;
164
209
  * Render a Tamagui v5 config module from flattened design tokens.
165
210
  *
166
211
  * Light and dark token sets are combined into one `createV5Theme` call.
212
+ * Typography and font-family tokens are emitted as `createFont` entries.
167
213
  *
168
214
  * @see https://tamagui.dev/docs/core/config-v5
215
+ * @see https://tamagui.dev/docs/core/font-language#font-tokens
169
216
  */
170
217
  declare function renderTamaguiConfig(tokens: FlatToken[], options?: TamaguiPluginOptions, fonts?: Fonts): string;
171
218
  /**
@@ -176,7 +223,7 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
176
223
  //#region src/index.d.ts
177
224
  /**
178
225
  * Razorwind plugin that turns design tokens into a Tamagui v5 config
179
- * (`createTamagui` + `createTokens` + `createV5Theme`).
226
+ * (`createTamagui` + `createTokens` + `createV5Theme` + `createFont`).
180
227
  *
181
228
  * Light and dark token sets are emitted as a single config: `createV5Theme`
182
229
  * receives both `lightPalette` / `darkPalette` and `childrenThemes` with
@@ -185,7 +232,12 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
185
232
  * set `lightPalette` / `darkPalette` (`color1`–`color12`). Light palettes are
186
233
  * ordered lightest-first; dark palettes darkest-first.
187
234
  *
235
+ * Typography tokens (`$type: "typography"`) and font-family tokens each emit
236
+ * a Tamagui `createFont` entry. Names with a `_` suffix (or a nested language
237
+ * segment) become FontLanguage variants (`body_cn`).
238
+ *
188
239
  * @see https://tamagui.dev/docs/core/config-v5
240
+ * @see https://tamagui.dev/docs/core/font-language#font-tokens
189
241
  *
190
242
  * @example
191
243
  * ```ts
@@ -199,5 +251,5 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
199
251
  */
200
252
  declare const _default: (options?: TamaguiPluginOptions | undefined) => import("@razorwind/core/plugin").Plugin;
201
253
  //#endregion
202
- export { type FlatToken, type TamaguiAnimationDriver, type TamaguiPluginOptions, type TamaguiTokenCategory, collectColorScales, colorLightness, _default as default, flattenTokens, formatTokenValue, generateTamaguiConfig, isPaletteGroup, orderPaletteForScheme, renderInstallMd, renderTamaguiConfig, resolveTokenCategory, resolveTokenSets, toCamelCaseKey, toCssVar, toTamaguiValue, toTokenKey };
254
+ export { type FlatToken, type TamaguiAnimationDriver, type TamaguiFontDef, type TamaguiPluginOptions, type TamaguiTokenCategory, collectColorScales, collectTamaguiFonts, colorLightness, _default as default, flattenTokens, fontVarName, formatTokenValue, generateTamaguiConfig, isPaletteGroup, orderPaletteForScheme, renderInstallMd, renderTamaguiConfig, resolveTokenCategory, resolveTokenSets, tamaguiFontKeyFromRole, toCamelCaseKey, toCssVar, toTamaguiValue, toTokenKey, typographyFontKey };
203
255
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/flatten.ts","../src/format.ts","../src/install.ts","../src/generate.ts","../src/index.ts"],"mappings":""}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/flatten.ts","../src/fonts.ts","../src/format.ts","../src/install.ts","../src/generate.ts","../src/index.ts"],"mappings":""}
package/dist/index.mjs CHANGED
@@ -1,5 +1,8 @@
1
- import{definePlugin as e}from"@razorwind/core/plugin";import{cssFontFamily as t,fontFamilyName as n}from"@razorwind/core/lib/fonts";import{createDocument as r,formatTokenValue as i,isObject as a,resolveTokenSets as o,toCssVar as s}from"@razorwind/core/utils";import{basename as c,dirname as l,join as u}from"node:path";function d(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`).replaceAll(`
2
- `,`\\n`).replaceAll(`\r`,`\\r`)}function f(e){return typeof e==`string`?`"${d(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function p(e,t){if(typeof e==`number`)return e;if(typeof e==`boolean`)return Number(e);if(a(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 String(e)}const m=[{prefix:/^(?:color|colours?|palette)\b/i,category:`color`},{prefix:/^(?:space|spacing|gap|inset)\b/i,category:`space`},{prefix:/^(?:size|sizing)\b/i,category:`size`},{prefix:/^(?:radius|rounded|radii)\b/i,category:`radius`},{prefix:/^(?:z-?index|zindex|elevation)\b/i,category:`zIndex`}];function h(e){return`$value`in e||`value`in e||`$ref`in e||`ref`in e}function g(e){return e===!0||e===`true`||e===1}function _(e){return g(e.palette)||g(e.$palette)?!0:b(e)===`palette`}function v(e,t){return(e===`palette`||e===`$palette`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function y(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function b(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function x(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 S(e,t){for(let{prefix:t,category:n}of m)if(t.test(e))return n;if(t===`color`||t===`palette`)return`color`;if(t===`dimension`){if(/space|spacing|gap|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|width|height/i.test(e))return`size`}if(t===`number`&&/z-?index|elevation/i.test(e))return`zIndex`}function C(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 w(e){let t=e.split(`.`).filter(Boolean),n=t[0];n&&/^(?:color|colours?|palette|space|spacing|gap|inset|size|sizing|radius|rounded|radii|z-?index|zindex|elevation)$/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`:C(r)}function T(e,t,n,r,o,s){if(!a(e))return;let c=o||_(e),l=b(e,n);if(h(e)){let n=x(e),a=t.join(`.`),o=S(a,l)??(c||l===`palette`?`color`:void 0),u=i(n,l),d=o===`color`||l===`color`||l===`palette`?u:p(n,l);s.push({path:a,type:l===`palette`?`color`:l,value:n,cssValue:u,tamaguiValue:d,category:o,tokenKey:o?w(a):void 0,description:y(e),theme:r,palette:c||void 0});return}for(let[n,i]of Object.entries(e))n.startsWith(`$`)&&n!==`$palette`||v(n,i)||T(i,[...t,n],l,r,c,s)}function E(e,t={}){let n=t.includeTypes?new Set(t.includeTypes):void 0,r=[];for(let t of o(e)){let e=t.id==="default"?void 0:t.id;T(t.tokens,[],void 0,e,!1,r)}return n?r.filter(e=>!e.type||n.has(e.type)):r}function D(e){return`# Installing Tamagui Config
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:ee(e)===`palette`}function O(e,t){return(e===`palette`||e===`$palette`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function k(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function ee(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function te(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 ne(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 re(e){let t=e.split(`.`).filter(Boolean),n=t[0];n&&/^(?:color|colours?|palette|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 ie(e,t,r,a,o,s){if(!i(e))return;let c=o||D(e),l=ee(e,r);if(T(e)){let r=te(e),i=t.join(`.`),o=ne(i,l)??(c||l===`palette`?`color`:void 0),u=n(r,l),d=o&&C.has(o)||l===`color`||l===`palette`||l===`shadow`?u:h(r,l);s.push({path:i,type:l===`palette`?`color`:l,value:r,cssValue:u,tamaguiValue:d,category:o,tokenKey:o?re(i):void 0,description:k(e),theme:a,palette:c||void 0});return}for(let[n,r]of Object.entries(e))n.startsWith(`$`)&&n!==`$palette`||O(n,r)||ie(r,[...t,n],l,a,c,s)}function ae(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;ie(t.tokens,[],void 0,e,!1,r)}return n?r.filter(e=>!e.type||n.has(e.type)):r}const oe=/^\{([^{}]+)\}$/,se=/^(?:typography|type|text)$/i,ce=/^(?:font|fonts|font-family|fontFamily)$/i,le=/^(?:font-size|fontSize)$/i,ue=/^(?:font-weight|fontWeight)$/i,de=/^(?:line-height|lineHeight|leading)$/i,fe=/^(?:letter-spacing|letterSpacing|tracking)$/i,pe=/^(?:[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,me=[`fontFamily`,`font-family`,`family`],he=[`fontSize`,`font-size`,`size`],ge=[`fontWeight`,`font-weight`,`weight`],_e=[`lineHeight`,`line-height`,`leading`],ve=[`letterSpacing`,`letter-spacing`,`tracking`],ye={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 oe.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 be(e){return(e.split(`,`)[0]?.trim()??e).replaceAll(/^["']|["']$/g,``)}function xe(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 Se(e){return Number.isInteger(e)?e:Math.round(e*1e3)/1e3}function P(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 Ce(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 we(e,t){let n=P(e);if(n!=null)return Se(t!=null&&n>0&&n<=4?n*t:n)}function F(e,t){return t.test(e.split(`.`)[0]??``)}function Te(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`heading`:case`title`:case`display`:return`heading`;case`mono`:case`monospace`:case`caption`:case`code`:return`mono`;case`sans`:case`body`:case`serif`:return`body`;default:return L([e])}}function Ee(e){return e.role?R(e.role):R(e.name)}function De(e){let t=I(e,se);if(t.length===0)return`body`;let n=t.at(-1);return n&&t.length>=2&&pe.test(n)&&!n.includes(`_`)?`${L(t.slice(0,-1))}_${n}`:L(t)}function Oe(e){return R(I(e,ce)[0]??Te(e))}function z(e,t){let n=I(e,t);return n.length===0||n.length===1&&/^(?:DEFAULT|default)$/i.test(n[0])?`true`:L(n)}function ke(e){return e.type===`typography`&&i(e.value)}function Ae(e){return e.category===`fontSize`||e.category===`fontWeight`||je(e)||Me(e)||Ne(e)||Pe(e)?!1:e.type===`fontFamily`||F(e.path,ce)}function je(e){return e.category===`fontSize`||F(e.path,le)}function Me(e){return e.category===`fontWeight`||e.type===`fontWeight`||F(e.path,ue)}function Ne(e){return F(e.path,de)}function Pe(e){return F(e.path,fe)}function Fe(e){let t=new Map;for(let n of Object.values(e)){let e=Ee(n),r=t.get(e);(!r||n.role===e&&r.role!==e)&&t.set(e,n)}return t}function Ie(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=be(t).toLowerCase();return r.find(e=>f(e).toLowerCase()===i||e.title.toLowerCase()===i||e.name.toLowerCase()===i)}function Le(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`?Le(t):e.face}}function V(e){return{key:e,webFamily:`system-ui, sans-serif`,nativeFamily:`system-ui`,size:{},lineHeight:{},weight:{},letterSpacing:{}}}function Re(e,t){return{...e,webFamily:t,nativeFamily:be(t)}}function ze(e,t){let n={},r=[],i={},a={};for(let o of e){if(je(o)){let e=P(M(o.value,t));e!=null&&(n[z(o.path,le)]=e);continue}if(Me(o)){let e=Ce(M(o.value,t));e&&(i[z(o.path,ue)]=e);continue}if(Pe(o)){let e=P(M(o.value,t));e!=null&&(a[z(o.path,fe)]=e);continue}Ne(o)&&r.push({key:z(o.path,de),value:M(o.value,t)})}let o=n.true??n.base??Object.values(n)[0],s={};for(let e of r){let t=n[e.key]??o,r=we(e.value,t);r!=null&&(s[e.key]=r)}return{size:n,lineHeight:s,weight:i,letterSpacing:a}}function H(e,t){return{...t,...e}}function U(e,t){return{...e,size:H(e.size,t.size),lineHeight:H(e.lineHeight,t.lineHeight),weight:H(e.weight,t.weight),letterSpacing:H(e.letterSpacing,t.letterSpacing)}}function Be(e){return Object.keys(e.size).length>0?e:{...e,size:{...ye}}}function Ve(e,t,n,r){if(!i(t.value))return e;let a=N(t.value,me),o=j(a),s=xe(M(a,n)),c=Ie(r,s,o),l=e;c?l=B(l,c):s&&(l=Re(l,s));let u=P(M(N(t.value,he),n));u!=null&&(l={...l,size:{...l.size,true:u}});let d=Ce(M(N(t.value,ge),n));d&&(l={...l,weight:{...l.weight,true:d}});let f=P(M(N(t.value,ve),n));f!=null&&(l={...l,letterSpacing:{...l.letterSpacing,true:f}});let p=we(M(N(t.value,_e),n),l.size.true??u);return p!=null&&(l={...l,lineHeight:{...l.lineHeight,true:p}}),l}function He(e,t){let n=new Map(e.map(e=>[e.path,e])),r=ze(e,n),i=new Map,a=e=>{i.set(e.key,e)};if(t)for(let[e,n]of Fe(t))a(U(B(V(e),n),r));for(let o of e){if(!Ae(o)||ke(o))continue;let e=Oe(o.path),s=xe(M(o.value,n)),c=i.get(e)??V(e),l=Ie(t,s,o.path),u=c;l?u=B(u,l):(s&&c.webFamily===V(e).webFamily||s&&!i.has(e))&&(u=Re(u,s)),a(U(u,r))}for(let o of e){if(!ke(o))continue;let e=De(o.path);a(Ve(U(i.get(e)??V(e),r),o,n,t))}return[...i.values()].map(Be).toSorted((e,t)=>e.key.localeCompare(t.key))}function Ue(e){return/^\d+$/.test(e)||/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}function W(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}${Ue(e)}: ${m(t)}`).join(`,
4
+ `)}\n${r}}`}function We(e,t){let n=`${e.replaceAll(/\W/g,``)||`font${t}`}Font`;return/^[A-Z_]/i.test(n)?n:`font${t}`}function Ge(e,t){let n=[` family: isWeb ? ${m(e.webFamily)} : ${m(e.nativeFamily)}`,` size: ${W(e.size)}`];return Object.keys(e.lineHeight).length>0&&n.push(` lineHeight: ${W(e.lineHeight)}`),Object.keys(e.weight).length>0&&n.push(` weight: ${W(e.weight)}`),Object.keys(e.letterSpacing).length>0&&n.push(` letterSpacing: ${W(e.letterSpacing)}`),e.face&&n.push(` face: ${e.face}`),`const ${t} = createFont({\n${n.join(`,
5
+ `)}\n});`}function Ke(e){return`# Installing Tamagui Config
3
6
 
4
7
  Generated by \`@razorwind/tamagui\`.
5
8
 
@@ -32,26 +35,32 @@ export function App() {
32
35
  }
33
36
  \`\`\`
34
37
 
35
- 3. Use token props such as \`color="$primary"\` or \`padding="$sm"\` per your generated token map.
38
+ 3. Use generated tokens with Tamagui style props
39
+ ([styles](https://tamagui.dev/docs/intro/styles), [tokens](https://tamagui.dev/docs/core/tokens)):
40
+
41
+ - \`color="$primary"\` / \`padding="$sm"\` / \`borderRadius="$md"\`
42
+ - \`fontFamily="$body"\` / \`fontSize="$true"\` / \`fontWeight="$bold"\`
43
+ - Language variants: \`<FontLanguage body="cn">\` when a \`body_cn\` font is generated
44
+ - \`boxShadow="$shadow.sm"\` / \`boxShadow="$insetShadow.xs"\`
45
+ - \`textShadow="$textShadow.sm"\`
46
+ - \`filter="$dropShadow.sm"\`
36
47
 
37
48
  ## Regenerate
38
49
 
39
50
  Re-run Razorwind generate when tokens change so \`${e.outputPath}\` stays aligned with your design system.
40
- `}const O=new Set([`default`,`light`,`theme`]),k=/^base(?:[A-Z]\w*|[._-].+)?$/i,A=[`base`,`gray`,`grey`,`neutral`],j={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function M(e){return O.has(e)}function N(e){return e===`dark`}function P(e,t){let n=new Map,r=t===`dark`?N:M;for(let t of e){let e=t.theme?.toLowerCase();(!e||k.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 ee(e){let t={};for(let n of e){if(!n.category||!n.tokenKey)continue;let e=t[n.category]??{};e[n.tokenKey]=n.tamaguiValue,t[n.category]=e}return t}function F(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=/^[A-Z_$][\w$]*$/i.test(e)?e:f(e);return`${n}${r}: ${f(t)}`}).join(`,
41
- `)}\n${` `.repeat(Math.max(t-2,0))}}`}function I(e){if(e>=1&&e<=12)return e;if(e>=100&&e<=900&&e%100==0)return e/100}function L(e){let t=e.path.split(`.`).filter(Boolean),n=t.at(-1);if(n&&/^\d+$/.test(n)){let e=I(Number(n)),r=t.at(-2);if(e!=null&&r&&!/^(?:color|colours?|palette)$/i.test(r))return{name:C([r]),step:e}}if(!e.tokenKey)return;let r=/^([A-Z]+)(\d{1,3})$/i.exec(e.tokenKey);if(!r)return;let[,i=``,a=``]=r,o=I(Number(a));if(o!=null)return{name:i,step:o}}function R(e,t,n,r){let i=e[t]??{};i[`${t}${n}`]=r,e[t]=i}function z(e){let t={};for(let n of e){if(typeof n.tamaguiValue!=`string`)continue;let e=L(n);e&&R(t,e.name,e.step,n.tamaguiValue)}return Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=3))}function B(e){let t={};for(let n of e){if(!n.palette||typeof n.tamaguiValue!=`string`)continue;let e=L(n);e&&R(t,e.name,e.step,n.tamaguiValue)}let n=Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=2));return Object.keys(n).length>0?n:z(e)}function V(e,t){if(e.length<2)return[...e];let n=q(e[0]),r=q(e[e.length-1]);if(n==null||r==null||n===r)return[...e];let i=n>r;return t===`light`?i?[...e]:e.toReversed():i?e.toReversed():[...e]}function H(e){return e<=.04045?e/12.92:((e+.055)/1.055)**2.4}function U(e){let t=e.startsWith(`#`)?e.slice(1):``;if((t.length===3||t.length===4)&&(t=[...t].map(e=>e+e).join(``)),t.length===8&&(t=t.slice(0,6)),t.length!==6||/[^0-9a-f]/i.test(t))return;let n=Number.parseInt(t.slice(0,2),16)/255,r=Number.parseInt(t.slice(2,4),16)/255,i=Number.parseInt(t.slice(4,6),16)/255;return .2126*H(n)+.7152*H(r)+.0722*H(i)}function W(e){let t=e.trim();if(t.endsWith(`%`)){let e=Number.parseFloat(t);return Number.isFinite(e)?e/100:void 0}let n=Number.parseFloat(t);return Number.isFinite(n)?n:void 0}function G(e){return e>1?e/100:e}function K(e,t){let n=RegExp(`^${t}\\((.+)\\)$`,`i`).exec(e.trim());if(n?.[1])return n[1].split(/[\s,/]+/).filter(Boolean)}function q(e){let t=e.trim();if(!t||t.startsWith(`var(`)||t.includes(`{`))return;let n=U(t);if(n!=null)return n;let r=K(t,`oklch`);if(r?.[0]){let e=W(r[0]);return e==null?void 0:G(e)}let i=K(t,`hsla?`);if(i?.[2]){let e=W(i[2]);return e==null?void 0:G(e)}let a=K(t,`rgba?`);if(a?.[0]&&a[1]&&a[2]){let e=W(a[0]),t=W(a[1]),n=W(a[2]);if(e==null||t==null||n==null)return;let r=(e,t)=>t.trim().endsWith(`%`)||e<=1?e:e/255;return .2126*H(r(e,a[0]))+.7152*H(r(t,a[1]))+.0722*H(r(n,a[2]))}}function J(e,t){let n=[],r=t.toLowerCase();for(let[i,a]of Object.entries(e)){if(!i.toLowerCase().startsWith(r))continue;let e=i.slice(t.length);/^\d+$/.test(e)&&n.push([Number(e),a])}return n.sort(([e],[t])=>e-t),n}function Y(e,t,n){let r=J(e,t);if(r.length===0)return e;let i=V(r.map(([,e])=>e),n),a={};for(let[e,[n]]of r.entries())a[`${t}${n}`]=i[e]??r[e][1];return a}function te(e){if(e.length>=12)return e.slice(0,12);let t=[...e],n=t.at(-1);if(n==null)return t;for(;t.length<12;)t.push(n);return t}function ne(e,t,n){let r=J(e,t);if(!(r.length<2))return te(V(r.map(([,e])=>e),n))}function X(e,t){let n=new Map(Object.entries(e).map(([e,t])=>[e.toLowerCase(),{name:e,scale:t}]));for(let e of A){let r=n.get(e);if(!r)continue;let i=ne(r.scale,r.name,t);if(i)return i}}function re(e){let t=e.filter(e=>e.category===`color`||e.palette),n=B(P(t,`light`)),r=B(P(t,`dark`));return{lightPalette:X(n,`light`),darkPalette:X(r,`dark`)}}function Z(e){let t=B(e),n={};for(let r of e)r.category!==`color`||!r.tokenKey||typeof r.tamaguiValue!=`string`||r.palette||/^[A-Z]+\d{1,3}$/i.test(r.tokenKey)&&t[r.tokenKey.replace(/\d{1,3}$/,``)]||(n[r.tokenKey]=r.tamaguiValue);return n}function ie(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);if(n.size===0)return;let r=[];for(let i of[...n].toSorted((e,t)=>e.localeCompare(t))){let n=Y(e[i]??t[i]??{},i,`light`),a=Y(t[i]??e[i]??{},i,`dark`);Object.keys(n).length!==0&&Object.keys(a).length!==0&&r.push(` ${i}: {
42
- light: ${F(n,8)},
43
- dark: ${F(a,8)}
51
+ `}const qe=new Set([`default`,`light`,`theme`]),Je=/^base(?:[A-Z]\w*|[._-].+)?$/i,Ye=[`base`,`gray`,`grey`,`neutral`],Xe={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function Ze(e){return qe.has(e)}function Qe(e){return e===`dark`}function G(e,t){let n=new Map,r=t===`dark`?Qe:Ze;for(let t of e){let e=t.theme?.toLowerCase();(!e||Je.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()]}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?A([t]):e.tokenKey}return e.tokenKey??``}function rt(e){return e.category&&$e.has(e.category)&&typeof e.tamaguiValue==`number`?`px(${e.tamaguiValue})`:e.category===`dropShadow`&&typeof e.tamaguiValue==`string`?it(e.tamaguiValue):e.tamaguiValue}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={};for(let n of e){if(!n.category||n.category===`color`||!n.tokenKey)continue;let e=nt(n);if(!e)continue;let r=t[n.category]??{};r[e]=rt(n),t[n.category]=r}return t}function ot(e,t){let n={},r=(e,t)=>{let r=t.cssValue;typeof r!=`string`||r.length===0||J(r)||r===`[object Object]`||(n[e]=r)},i=e=>{let t=e.path.replace(/^color\./i,``).replaceAll(`.`,``);return e.theme?`${e.theme}_${t}`:t};for(let t of e)t.tokenKey&&(t.palette?r(i(t),t):r(t.tokenKey,t));for(let e of t)!e.tokenKey||!e.palette||r(i(e),e);return n}function K(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:m(t);return`${n}${/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}: ${r}`}).join(`,
52
+ `)}\n${` `.repeat(Math.max(t-2,0))}}`}function st(e,t=2){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${n}...theme\n${r}}`:`{\n${n}...theme,\n${i.map(([e,t])=>`${n}${/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}: ${t}`).join(`,
53
+ `)}\n${r}}`}const ct=/^\{([^{}]+)\}$/,lt=/^var\((--[^),\s]+)(?:\s*,[^)]*)?\)$/;function ut(e){if(typeof e==`string`)return ct.exec(e.trim())?.[1]?.trim()}function q(e){if(typeof e==`string`)return lt.exec(e.trim())?.[1]}function J(e){return ut(e)!=null||q(e)!=null}function dt(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=ut(r.value);if(e){let n=t.get(e);if(!n||n.path===r.path)return r;r=n;continue}let a=q(r.value)??q(r.cssValue)??q(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){return/^[A-Z_$][\w$]*$/i.test(e)?`theme.${e}`:`theme[${m(e)}]`}function pt(e,t,n){let r=Y(e);if(r){if(t&&r.name.toLowerCase()===t.toLowerCase())return`color${r.step}`;if(n[r.name])return`${r.name}${r.step}`}}function mt(e){if(e>=1&&e<=12)return e;if(e>=100&&e<=900&&e%100==0)return e/100}function Y(e){let t=e.path.split(`.`).filter(Boolean),n=t.at(-1);if(n&&/^\d+$/.test(n)){let e=mt(Number(n)),r=t.at(-2);if(e!=null&&r&&!/^(?:color|colours?|palette)$/i.test(r))return{name:A([r]),step:e}}if(!e.tokenKey)return;let r=/^([A-Z]+)(\d{1,3})$/i.exec(e.tokenKey);if(!r)return;let[,i=``,a=``]=r,o=mt(Number(a));if(o!=null)return{name:i,step:o}}function ht(e,t,n,r){let i=e[t]??{};i[`${t}${n}`]=r,e[t]=i}function gt(e){let t={};for(let n of e){if(typeof n.tamaguiValue!=`string`)continue;let e=Y(n);e&&ht(t,e.name,e.step,n.tamaguiValue)}return Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=3))}function X(e){let t={};for(let n of e){if(!n.palette||typeof n.tamaguiValue!=`string`)continue;let e=Y(n);e&&ht(t,e.name,e.step,n.tamaguiValue)}let n=Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=2));return Object.keys(n).length>0?n:gt(e)}function Z(e,t){if(e.length<2)return[...e];let n=bt(e[0]),r=bt(e[e.length-1]);if(n==null||r==null||n===r)return[...e];let i=n>r;return t===`light`?i?[...e]:e.toReversed():i?e.toReversed():[...e]}function Q(e){return e<=.04045?e/12.92:((e+.055)/1.055)**2.4}function _t(e){let t=e.startsWith(`#`)?e.slice(1):``;if((t.length===3||t.length===4)&&(t=[...t].map(e=>e+e).join(``)),t.length===8&&(t=t.slice(0,6)),t.length!==6||/[^0-9a-f]/i.test(t))return;let n=Number.parseInt(t.slice(0,2),16)/255,r=Number.parseInt(t.slice(2,4),16)/255,i=Number.parseInt(t.slice(4,6),16)/255;return .2126*Q(n)+.7152*Q(r)+.0722*Q(i)}function $(e){let t=e.trim();if(t.endsWith(`%`)){let e=Number.parseFloat(t);return Number.isFinite(e)?e/100:void 0}let n=Number.parseFloat(t);return Number.isFinite(n)?n:void 0}function vt(e){return e>1?e/100:e}function yt(e,t){let n=RegExp(`^${t}\\((.+)\\)$`,`i`).exec(e.trim());if(n?.[1])return n[1].split(/[\s,/]+/).filter(Boolean)}function bt(e){let t=e.trim();if(!t||t.startsWith(`var(`)||t.includes(`{`))return;let n=_t(t);if(n!=null)return n;let r=yt(t,`oklch`);if(r?.[0]){let e=$(r[0]);return e==null?void 0:vt(e)}let i=yt(t,`hsla?`);if(i?.[2]){let e=$(i[2]);return e==null?void 0:vt(e)}let a=yt(t,`rgba?`);if(a?.[0]&&a[1]&&a[2]){let e=$(a[0]),t=$(a[1]),n=$(a[2]);if(e==null||t==null||n==null)return;let r=(e,t)=>t.trim().endsWith(`%`)||e<=1?e:e/255;return .2126*Q(r(e,a[0]))+.7152*Q(r(t,a[1]))+.0722*Q(r(n,a[2]))}}function xt(e,t){let n=[],r=t.toLowerCase();for(let[i,a]of Object.entries(e)){if(!i.toLowerCase().startsWith(r))continue;let e=i.slice(t.length);/^\d+$/.test(e)&&n.push([Number(e),a])}return n.sort(([e],[t])=>e-t),n}function St(e,t,n){let r=xt(e,t);if(r.length===0)return e;let i=Z(r.map(([,e])=>e),n),a={};for(let[e,[n]]of r.entries())a[`${t}${n}`]=i[e]??r[e][1];return a}function Ct(e){if(e.length>=12)return e.slice(0,12);let t=[...e],n=t.at(-1);if(n==null)return t;for(;t.length<12;)t.push(n);return t}function wt(e,t,n){let r=xt(e,t);if(!(r.length<2))return Ct(Z(r.map(([,e])=>e),n))}function Tt(e,t){let n=new Map(Object.entries(e).map(([e,t])=>[e.toLowerCase(),{name:e,scale:t}]));for(let e of Ye){let r=n.get(e);if(!r)continue;let i=wt(r.scale,r.name,t);if(i)return{name:r.name,palette:i}}}function Et(e){let t=e.filter(e=>e.category===`color`||e.palette),n=X(G(t,`light`)),r=X(G(t,`dark`)),i=Tt(n,`light`),a=Tt(r,`dark`);return{lightPalette:i?.palette,darkPalette:a?.palette,lightBaseName:i?.name,darkBaseName:a?.name}}function Dt(e,t){let n=X(e),r=new Map(e.map(e=>[e.path,e])),i=new Map(e.map(e=>[s(e.path),e])),a={};for(let o of e){if(o.category!==`color`||!o.tokenKey||o.palette||/^[A-Z]+\d{1,3}$/i.test(o.tokenKey)&&n[o.tokenKey.replace(/\d{1,3}$/,``)])continue;let e=dt(o,r,i),s=pt(e,t,n);if(s){a[o.tokenKey]=ft(s);continue}let c=e.tamaguiValue;J(c)||J(e.cssValue)||(typeof c==`string`||typeof c==`number`)&&(a[o.tokenKey]=m(c))}return a}function Ot(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);if(n.size===0)return;let r=[];for(let i of[...n].toSorted((e,t)=>e.localeCompare(t))){let n=St(e[i]??t[i]??{},i,`light`),a=St(t[i]??e[i]??{},i,`dark`);Object.keys(n).length!==0&&Object.keys(a).length!==0&&r.push(` ${i}: {
54
+ light: ${K(n,8)},
55
+ dark: ${K(a,8)}
44
56
  }`)}if(r.length!==0)return`{\n${r.join(`,
45
- `)}\n }`}function ae(e){switch(e.role){case`heading`:case`display`:return`heading`;case`mono`:case`code`:return`mono`;case`sans`:case`body`:case`serif`:return`body`;case void 0:default:return e.name?.replaceAll(/\W/g,``)||`body`}}function oe(e){let t=new Map;for(let n of Object.values(e)){let e=ae(n),r=t.get(e);(!r||n.role===e&&r.role!==e)&&t.set(e,n)}return t}function se(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: ${f(t.normal)}`),t.italic&&n.push(`italic: ${f(t.italic)}`),` ${e}: { ${n.join(`, `)} }`}).join(`,
46
- `)}\n }`}function ce(e,r){let i=e.source===`local`?se(e):void 0,a=[`const ${r} = createFont({`,` family: isWeb ? ${f(t(e))} : ${f(n(e))},`,` size: {`,` 1: 12,`,` 2: 14,`,` 3: 16,`,` 4: 18,`,` 5: 20,`,` 6: 24,`,` 7: 28,`,` 8: 32,`,` 9: 40,`,` 10: 48`,` }${i?`,`:``}`];return i&&a.push(` face: ${i}`),a.push(`});`),a.join(`
47
- `)}function Q(e,t={},n){let r=t.useDefaultConfig!==!1,i=t.animations??`css`,a=t.includeTypeAugmentation!==!1,o=ee(P(e,`light`)),s=e.filter(e=>e.category===`color`),c=P(s,`light`),l=P(s,`dark`),u=B(c),d=B(l.length>0?l:c),{lightPalette:p,darkPalette:m}=re(e),h=ie(u,d),g=Z(c),_=Z(l.length>0?l:c),v=Object.keys(g).length>0||Object.keys(_).length>0,y=[];for(let e of[`color`,`space`,`size`,`radius`,`zIndex`]){let t=o[e];t&&Object.keys(t).length>0&&y.push(` ${e}: ${F(t,4)}`)}let b=[];p&&b.push(` lightPalette: ${f(p)}`),m&&b.push(` darkPalette: ${f(m)}`),h&&b.push(` childrenThemes: ${h}`),v&&b.push(` getTheme: ({ scheme }) => {
48
- const semantic = scheme === "dark"
49
- ? ${F(_,8)}
50
- : ${F(g,8)};
51
- return semantic;
52
- }`);let x=[];r?x.push(`import { createV5Theme, defaultConfig } from "@tamagui/config/v5";`):x.push(`import { createV5Theme } from "@tamagui/config/v5";`),i!==!1&&x.push(`import { animations } from "${j[i]}";`);let S=[`createTamagui`];y.length>0&&S.push(`createTokens`);let C=n?oe(n):new Map;C.size>0&&S.push(`createFont`,`isWeb`),x.push(`import { ${S.join(`, `)} } from "tamagui";`);let w=[`/* eslint-disable */`,`/*`,` * Generated by @razorwind/tamagui — do not edit by hand.`,` * @see https://tamagui.dev/docs/core/config-v5`,` */`,``,...x,``];y.length>0&&w.push(`const tokens = createTokens({`,y.join(`,
53
- `),`});`,``);let T=b.length>0?`createV5Theme({\n${b.join(`,
54
- `)}\n})`:`createV5Theme()`;w.push(`const themes = ${T};`,``);let E=new Map;if(C.size>0){let e=0;for(let[t,n]of C){let r=`${t}Font`.replaceAll(/\W/g,``)||`font${e}`;E.set(t,r),w.push(ce(n,r),``),e+=1}}let D=[];if(r&&D.push(` ...defaultConfig`),i!==!1&&D.push(` animations`),y.length>0&&(r?D.push(` tokens: {
57
+ `)}\n }`}function kt(e,t={},n){let r=t.useDefaultConfig!==!1,i=t.animations??`css`,a=t.includeTypeAugmentation!==!1,o=e.filter(e=>e.category===`color`),s=G(o,`light`),c=G(o,`dark`),l=X(s),u=X(c.length>0?c:s),{lightPalette:d,darkPalette:f,lightBaseName:p,darkBaseName:h}=Et(e),g=Ot(l,u),_=Dt(s,p),v=Dt(c.length>0?c:s,c.length>0?h:p),y=at(G(e,`light`)),b=ot(s,c),x=[];Object.keys(b).length>0&&x.push(` color: ${K(b,4)}`);for(let e of et){let t=y[e];t&&Object.keys(t).length>0&&x.push(` ${e}: ${K(t,4)}`)}let S=[];d&&S.push(` lightPalette: ${m(d)}`),f&&S.push(` darkPalette: ${m(f)}`),g&&S.push(` childrenThemes: ${g}`),(Object.keys(_).length>0||Object.keys(v).length>0)&&S.push(` getTheme: ({ theme, scheme }: Parameters<CreateV5ThemeOptions["getTheme"]>[0]) => {
58
+ return scheme === "dark"
59
+ ? ${st(v,8)}
60
+ : ${st(_,8)};
61
+ }`);let C=[`import { isWeb } from '@tamagui/constants';`];r?C.push(`import { createV5Theme, defaultConfig, type CreateV5ThemeOptions } from "@tamagui/config/v5";`):C.push(`import { createV5Theme, type CreateV5ThemeOptions } from "@tamagui/config/v5";`),i!==!1&&C.push(`import { animations } from "${Xe[i]}";`);let w=[`createTamagui`,`px`];x.length>0&&w.push(`createTokens`);let T=He(G(e,`light`),n);T.length>0&&w.push(`createFont`),C.push(`import { ${w.join(`, `)} } from "@tamagui/core";`);let E=[`/* eslint-disable */`,``,`/*`,` * Generated by @razorwind/tamagui — Do not edit by hand.`,` * `,` * @see https://tamagui.dev/docs/core/config-v5`,` */`,``,...C,``];x.length>0&&E.push(`const tokens = createTokens({`,x.join(`,
62
+ `),`});`,``);let D=S.length>0?`createV5Theme({\n${S.join(`,
63
+ `)}\n})`:`createV5Theme()`;E.push(`const themes = ${D};`,``);let O=new Map;if(T.length>0)for(let[e,t]of T.entries()){let n=We(t.key,e);O.set(t.key,n),E.push(Ge(t,n),``)}let k=[];if(r&&k.push(` ...defaultConfig`),i!==!1&&k.push(` animations`),x.length>0&&(r?k.push(` tokens: {
55
64
  ...defaultConfig.tokens,
56
65
  ...tokens,
57
66
  color: {
@@ -74,14 +83,14 @@ Re-run Razorwind generate when tokens change so \`${e.outputPath}\` stays aligne
74
83
  ...defaultConfig.tokens.zIndex,
75
84
  ...tokens.zIndex
76
85
  }
77
- }`):D.push(` tokens`)),D.push(` themes`),E.size>0){let e=[...E.entries()].map(([e,t])=>` ${e}: ${t}`);r?D.push(` fonts: {
86
+ }`):k.push(` tokens`)),k.push(` themes`),O.size>0){let e=[...O.entries()].map(([e,t])=>` ${/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}: ${t}`);r?k.push(` fonts: {
78
87
  ...defaultConfig.fonts,
79
88
  ${e.join(`,
80
89
  `)}
81
- }`):D.push(` fonts: {
90
+ }`):k.push(` fonts: {
82
91
  ${e.join(`,
83
92
  `)}
84
- }`)}return w.push(`export const config = createTamagui({`,D.join(`,
85
- `),`});`,``,`export type AppConfig = typeof config;`,``),a&&w.push(`declare module "tamagui" {`,` // eslint-disable-next-line @typescript-eslint/no-empty-object-type`,` interface TamaguiCustomConfig extends AppConfig {}`,`}`,``),w.push(`export default config;`,``),w.join(`
86
- `)}function $(e,t={}){let n=e.tokens&&Object.keys(e.tokens).length>0,i=e.fonts&&Object.keys(e.fonts).length>0;if(!n&&!i)return{};let a=n?E(e.tokens,t):[];if(a.length===0&&!i)return{};let o=t.outputPath??`tamagui.config.ts`,s=Q(a,t,e.fonts),c=t.installGuide??D({outputPath:o}),d=u(l(o),`INSTALL.md`);return{[o]:r(o,s,{name:`razorwind-tamagui`},!1,`typescript`),[d]:r(d,c,{name:`razorwind-tamagui`},!1,`markdown`)}}var le=e(e=>({name:`tamagui`,themeGeneration:`combined`,generate:async t=>$(t,e??{})}));export{B as collectColorScales,q as colorLightness,le as default,E as flattenTokens,i as formatTokenValue,$ as generateTamaguiConfig,_ as isPaletteGroup,V as orderPaletteForScheme,D as renderInstallMd,Q as renderTamaguiConfig,S as resolveTokenCategory,o as resolveTokenSets,C as toCamelCaseKey,s as toCssVar,p as toTamaguiValue,w as toTokenKey};
93
+ }`)}return E.push(`export const config = createTamagui({`,k.join(`,
94
+ `),`});`,``,`export type AppConfig = typeof config;`,``),a&&E.push(`declare module "@tamagui/core" {`,` // eslint-disable-next-line @typescript-eslint/no-empty-object-type`,` interface TamaguiCustomConfig extends AppConfig {}`,`}`,``),E.push(`export default config;`,``),E.join(`
95
+ `)}function At(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?ae(e.tokens,n):[];if(a.length===0&&!i)return{};let o=n.outputPath??`tamagui.config.ts`,s=kt(a,n,e.fonts),c=n.installGuide??Ke({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 jt=e(e=>({name:`tamagui`,themeGeneration:`combined`,generate:async t=>At(t,e??{})}));export{X as collectColorScales,He as collectTamaguiFonts,bt as colorLightness,jt as default,ae as flattenTokens,We as fontVarName,n as formatTokenValue,At as generateTamaguiConfig,D as isPaletteGroup,Z as orderPaletteForScheme,Ke as renderInstallMd,kt as renderTamaguiConfig,ne as resolveTokenCategory,a as resolveTokenSets,R as tamaguiFontKeyFromRole,A as toCamelCaseKey,o as toCssVar,h as toTamaguiValue,re as toTokenKey,De as typographyFontKey};
87
96
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@razorwind/tamagui",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "type": "module",
5
5
  "description": "Razorwind plugin that creates Tamagui theme tokens from Razorwind design tokens.",
6
6
  "repository": {
@@ -85,8 +85,9 @@
85
85
  "dependencies": {
86
86
  "@power-plant/core": "^0.0.90",
87
87
  "@power-plant/dtcg-schema": "^0.0.1",
88
- "@razorwind/core": "^0.0.51",
89
- "@stryke/type-checks": "^0.6.41"
88
+ "@razorwind/core": "^0.0.52",
89
+ "@stryke/type-checks": "^0.6.41",
90
+ "@stryke/string-format": "^0.17.50"
90
91
  },
91
92
  "peerDependencies": {
92
93
  "@tamagui/config": ">=1.120.0",
@@ -104,5 +105,5 @@
104
105
  "typescript": "^6.0.3"
105
106
  },
106
107
  "publishConfig": { "access": "public" },
107
- "gitHead": "907ed672d3b6b5cf02560ede8553693f3b4073c3"
108
+ "gitHead": "a72e2fb9b29f96e4f2c2241f622e56e6929f6dc9"
108
109
  }