@razorwind/tamagui 0.0.53 → 0.0.55
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 +39 -48
- package/dist/index.d.cts +24 -51
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +24 -51
- package/dist/index.mjs +39 -48
- package/package.json +3 -3
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
|
|
3
|
-
`)}\n }`}function
|
|
4
|
-
`)}\n${r}}`}function
|
|
5
|
-
`)}\n});`}function
|
|
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
|
|
6
6
|
|
|
7
7
|
Generated by \`@razorwind/tamagui\`.
|
|
8
8
|
|
|
9
9
|
## Files
|
|
10
10
|
|
|
11
|
-
- \`${e.outputPath}\` — Tamagui
|
|
11
|
+
- \`${e.outputPath}\` — Tamagui config (\`createTamagui\` + \`createTheme\` with light, dark, and nested semantic themes)
|
|
12
12
|
|
|
13
13
|
## Setup
|
|
14
14
|
|
|
@@ -48,50 +48,41 @@ 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
|
|
52
|
-
`)}\n${` `.repeat(Math.max(t-2,0))}}`}function
|
|
53
|
-
`)}\n${` `.repeat(Math.max(t-2,0))}}`}function ht(e,t=
|
|
54
|
-
`)}\n
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
...tokens.radius
|
|
78
|
-
},
|
|
79
|
-
zIndex: {
|
|
80
|
-
...defaultConfig.tokens.zIndex,
|
|
81
|
-
...tokens.zIndex
|
|
82
|
-
}
|
|
83
|
-
}`):M.push(` tokens`)),M.push(` themes`),j.size>0){let e=[...j.entries()].map(([e,t])=>` ${/^[A-Z_$][\w$]*$/i.test(e)?e:a(e)}: ${t}`);i?M.push(` fonts: {
|
|
84
|
-
...defaultConfig.fonts,
|
|
85
|
-
${e.join(`,
|
|
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`&>(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: {
|
|
56
|
+
...defaultConfig.tokens,
|
|
57
|
+
...tokens,
|
|
58
|
+
space: {
|
|
59
|
+
...defaultConfig.tokens.space,
|
|
60
|
+
...tokens.space
|
|
61
|
+
},
|
|
62
|
+
size: {
|
|
63
|
+
...defaultConfig.tokens.size,
|
|
64
|
+
...tokens.size
|
|
65
|
+
},
|
|
66
|
+
radius: {
|
|
67
|
+
...defaultConfig.tokens.radius,
|
|
68
|
+
...tokens.radius
|
|
69
|
+
},
|
|
70
|
+
zIndex: {
|
|
71
|
+
...defaultConfig.tokens.zIndex,
|
|
72
|
+
...tokens.zIndex
|
|
73
|
+
}
|
|
74
|
+
}`):E.push(` tokens`)),v&&E.push(` themes`),T.size>0){let e=[...T.entries()].map(([e,t])=>` ${/^[A-Z_$][\w$]*$/i.test(e)?e:a(e)}: ${t}`);i?E.push(` fonts: {
|
|
75
|
+
...defaultConfig.fonts,
|
|
76
|
+
${e.join(`,
|
|
86
77
|
`)}
|
|
87
|
-
|
|
88
|
-
${e.join(`,
|
|
78
|
+
}`):E.push(` fonts: {
|
|
79
|
+
${e.join(`,
|
|
89
80
|
`)}
|
|
90
|
-
|
|
91
|
-
* The Tamagui
|
|
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??[],`/**
|
|
82
|
+
* The Tamagui config for the ${e.name||`design system`}.
|
|
92
83
|
*
|
|
93
|
-
* @see https://tamagui.dev/docs/core/
|
|
84
|
+
* @see https://tamagui.dev/docs/core/configuration
|
|
94
85
|
*/
|
|
95
|
-
export const config = createTamagui({`,
|
|
96
|
-
`),n.importConfig?`, ...userConfig `:``,`});`,``,`export type AppConfig = typeof config;`,``),s&&
|
|
97
|
-
`)}function
|
|
86
|
+
export const config = createTamagui({`,E.join(`,
|
|
87
|
+
`),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;
|
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
|
-
* `
|
|
25
|
+
* `createTheme` 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
|
|
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.
|
|
112
112
|
*/
|
|
113
113
|
primitive?: boolean;
|
|
114
114
|
}
|
|
@@ -209,79 +209,52 @@ declare function toTamaguiValue(value: unknown, type?: string): string | number;
|
|
|
209
209
|
/**
|
|
210
210
|
* Build Tamagui INSTALL.md for generated config file.
|
|
211
211
|
*
|
|
212
|
-
* @see https://tamagui.dev/docs/core/
|
|
212
|
+
* @see https://tamagui.dev/docs/core/configuration
|
|
213
213
|
*/
|
|
214
214
|
declare function renderInstallMd(options: {
|
|
215
215
|
outputPath: string;
|
|
216
216
|
}): string;
|
|
217
217
|
//#endregion
|
|
218
218
|
//#region src/generate.d.ts
|
|
219
|
-
type ColorScheme = "light" | "dark";
|
|
220
|
-
/**
|
|
221
|
-
* Mirror a palette step across a numbered scale (`1` ↔ `max`, `2` ↔ `max-1`).
|
|
222
|
-
*
|
|
223
|
-
* Dark palettes are emitted darkest-first (`color1` / `red1` are the darkest
|
|
224
|
-
* stops), so a DTCG alias `{color.red.7}` must read `theme.red3` on a 9-step
|
|
225
|
-
* scale to keep pointing at the original token color.
|
|
226
|
-
*/
|
|
227
|
-
declare function flipPaletteStep(step: number, maxStep: number): number;
|
|
228
|
-
/**
|
|
229
|
-
* Collect color palettes for Tamagui `childrenThemes`.
|
|
230
|
-
*
|
|
231
|
-
* Groups marked `palette: true` (or `$type: "palette"`) win. When none are
|
|
232
|
-
* marked, numbered 1–12 (or 100–900) scales are used as a fallback.
|
|
233
|
-
*/
|
|
234
|
-
declare function collectColorScales(colorTokens: FlatToken[]): Record<string, Record<string, string>>;
|
|
235
219
|
/**
|
|
236
|
-
*
|
|
237
|
-
* lightest (`color1`–`color12`).
|
|
220
|
+
* Render a Tamagui config module from flattened design tokens.
|
|
238
221
|
*
|
|
239
|
-
*
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
*
|
|
244
|
-
* CSS variables and unresolved aliases return `undefined`.
|
|
245
|
-
*/
|
|
246
|
-
declare function colorLightness(color: string): number | undefined;
|
|
247
|
-
/**
|
|
248
|
-
* Render a Tamagui v5 config module from flattened design tokens.
|
|
222
|
+
* Light and dark token sets become `createTheme` objects. Semantic colors with
|
|
223
|
+
* a `theme` / `$theme` property are nested as `light_<name>` / `dark_<name>`,
|
|
224
|
+
* with the theme name stripped from the token key. Each typography token is
|
|
225
|
+
* emitted as its own `createFont` entry with that token's size, line height,
|
|
226
|
+
* and weight (not a shared type scale).
|
|
249
227
|
*
|
|
250
|
-
*
|
|
251
|
-
*
|
|
252
|
-
* token's size, line height, and weight (not a shared type scale).
|
|
253
|
-
*
|
|
254
|
-
* @see https://tamagui.dev/docs/core/config-v5
|
|
228
|
+
* @see https://tamagui.dev/docs/core/configuration
|
|
229
|
+
* @see https://tamagui.dev/docs/intro/themes
|
|
255
230
|
* @see https://tamagui.dev/docs/core/font-language#font-tokens
|
|
256
231
|
*/
|
|
257
232
|
declare function renderTamaguiConfig(spec: Schema, tokens: FlatToken[], options?: TamaguiPluginOptions): string;
|
|
258
233
|
/**
|
|
259
|
-
* Generate a Tamagui
|
|
234
|
+
* Generate a Tamagui config file from a Razorwind schema.
|
|
260
235
|
*/
|
|
261
236
|
declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOptions): GeneratorFunctionResult<Schema, TamaguiPluginOptions>;
|
|
262
237
|
//#endregion
|
|
263
238
|
//#region src/index.d.ts
|
|
264
239
|
/**
|
|
265
|
-
* Razorwind plugin that turns design tokens into a Tamagui
|
|
266
|
-
* (`createTamagui` + `createTokens` + `
|
|
240
|
+
* Razorwind plugin that turns design tokens into a Tamagui config
|
|
241
|
+
* (`createTamagui` + `createTokens` + `createTheme` + `createFont`).
|
|
267
242
|
*
|
|
268
|
-
* Light and dark token sets are emitted as a single config
|
|
269
|
-
*
|
|
270
|
-
* `
|
|
271
|
-
*
|
|
272
|
-
*
|
|
273
|
-
* `
|
|
274
|
-
*
|
|
275
|
-
* children theme maps `xPrimary` → `x` and `xTertiary` (or `xSecondary`) →
|
|
276
|
-
* `xSubtle`. Light palettes are ordered lightest-first; dark palettes
|
|
277
|
-
* darkest-first.
|
|
243
|
+
* Light and dark token sets are emitted as a single config. Semantic colors
|
|
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 })`.
|
|
278
250
|
*
|
|
279
251
|
* Typography tokens (`$type: "typography"`) each emit their own Tamagui
|
|
280
252
|
* `createFont` entry with that token's size, line height, and weight. Font
|
|
281
253
|
* keys keep the DTCG token name (`display-lg`). Names with a `_` suffix (or a
|
|
282
254
|
* nested language segment) become FontLanguage variants (`body_cn`).
|
|
283
255
|
*
|
|
284
|
-
* @see https://tamagui.dev/docs/core/
|
|
256
|
+
* @see https://tamagui.dev/docs/core/configuration
|
|
257
|
+
* @see https://tamagui.dev/docs/intro/themes
|
|
285
258
|
* @see https://tamagui.dev/docs/core/font-language#font-tokens
|
|
286
259
|
*
|
|
287
260
|
* @example
|
|
@@ -296,5 +269,5 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
|
|
|
296
269
|
*/
|
|
297
270
|
declare const _default: (options?: TamaguiPluginOptions | undefined) => import("@razorwind/core/plugin").Plugin;
|
|
298
271
|
//#endregion
|
|
299
|
-
export { type FlatToken, type TamaguiAnimationDriver, type TamaguiFontDef, type TamaguiPluginOptions, type TamaguiTokenCategory,
|
|
272
|
+
export { type FlatToken, type TamaguiAnimationDriver, type TamaguiFontDef, type TamaguiPluginOptions, type TamaguiTokenCategory, collectTamaguiFonts, _default as default, flattenTokens, fontVarName, formatTokenValue, generateTamaguiConfig, isPaletteGroup, renderInstallMd, renderTamaguiConfig, resolveTokenCategory, resolveTokenSets, tamaguiFontKeyFromRole, toCamelCaseKey, toCssVar, toTamaguiValue, toTokenKey, typographyFontKey };
|
|
300
273
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -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
|
|
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"}
|
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
|
-
* `
|
|
25
|
+
* `createTheme` 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
|
|
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.
|
|
112
112
|
*/
|
|
113
113
|
primitive?: boolean;
|
|
114
114
|
}
|
|
@@ -209,79 +209,52 @@ declare function toTamaguiValue(value: unknown, type?: string): string | number;
|
|
|
209
209
|
/**
|
|
210
210
|
* Build Tamagui INSTALL.md for generated config file.
|
|
211
211
|
*
|
|
212
|
-
* @see https://tamagui.dev/docs/core/
|
|
212
|
+
* @see https://tamagui.dev/docs/core/configuration
|
|
213
213
|
*/
|
|
214
214
|
declare function renderInstallMd(options: {
|
|
215
215
|
outputPath: string;
|
|
216
216
|
}): string;
|
|
217
217
|
//#endregion
|
|
218
218
|
//#region src/generate.d.ts
|
|
219
|
-
type ColorScheme = "light" | "dark";
|
|
220
|
-
/**
|
|
221
|
-
* Mirror a palette step across a numbered scale (`1` ↔ `max`, `2` ↔ `max-1`).
|
|
222
|
-
*
|
|
223
|
-
* Dark palettes are emitted darkest-first (`color1` / `red1` are the darkest
|
|
224
|
-
* stops), so a DTCG alias `{color.red.7}` must read `theme.red3` on a 9-step
|
|
225
|
-
* scale to keep pointing at the original token color.
|
|
226
|
-
*/
|
|
227
|
-
declare function flipPaletteStep(step: number, maxStep: number): number;
|
|
228
|
-
/**
|
|
229
|
-
* Collect color palettes for Tamagui `childrenThemes`.
|
|
230
|
-
*
|
|
231
|
-
* Groups marked `palette: true` (or `$type: "palette"`) win. When none are
|
|
232
|
-
* marked, numbered 1–12 (or 100–900) scales are used as a fallback.
|
|
233
|
-
*/
|
|
234
|
-
declare function collectColorScales(colorTokens: FlatToken[]): Record<string, Record<string, string>>;
|
|
235
219
|
/**
|
|
236
|
-
*
|
|
237
|
-
* lightest (`color1`–`color12`).
|
|
220
|
+
* Render a Tamagui config module from flattened design tokens.
|
|
238
221
|
*
|
|
239
|
-
*
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
*
|
|
244
|
-
* CSS variables and unresolved aliases return `undefined`.
|
|
245
|
-
*/
|
|
246
|
-
declare function colorLightness(color: string): number | undefined;
|
|
247
|
-
/**
|
|
248
|
-
* Render a Tamagui v5 config module from flattened design tokens.
|
|
222
|
+
* Light and dark token sets become `createTheme` objects. Semantic colors with
|
|
223
|
+
* a `theme` / `$theme` property are nested as `light_<name>` / `dark_<name>`,
|
|
224
|
+
* with the theme name stripped from the token key. Each typography token is
|
|
225
|
+
* emitted as its own `createFont` entry with that token's size, line height,
|
|
226
|
+
* and weight (not a shared type scale).
|
|
249
227
|
*
|
|
250
|
-
*
|
|
251
|
-
*
|
|
252
|
-
* token's size, line height, and weight (not a shared type scale).
|
|
253
|
-
*
|
|
254
|
-
* @see https://tamagui.dev/docs/core/config-v5
|
|
228
|
+
* @see https://tamagui.dev/docs/core/configuration
|
|
229
|
+
* @see https://tamagui.dev/docs/intro/themes
|
|
255
230
|
* @see https://tamagui.dev/docs/core/font-language#font-tokens
|
|
256
231
|
*/
|
|
257
232
|
declare function renderTamaguiConfig(spec: Schema, tokens: FlatToken[], options?: TamaguiPluginOptions): string;
|
|
258
233
|
/**
|
|
259
|
-
* Generate a Tamagui
|
|
234
|
+
* Generate a Tamagui config file from a Razorwind schema.
|
|
260
235
|
*/
|
|
261
236
|
declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOptions): GeneratorFunctionResult<Schema, TamaguiPluginOptions>;
|
|
262
237
|
//#endregion
|
|
263
238
|
//#region src/index.d.ts
|
|
264
239
|
/**
|
|
265
|
-
* Razorwind plugin that turns design tokens into a Tamagui
|
|
266
|
-
* (`createTamagui` + `createTokens` + `
|
|
240
|
+
* Razorwind plugin that turns design tokens into a Tamagui config
|
|
241
|
+
* (`createTamagui` + `createTokens` + `createTheme` + `createFont`).
|
|
267
242
|
*
|
|
268
|
-
* Light and dark token sets are emitted as a single config
|
|
269
|
-
*
|
|
270
|
-
* `
|
|
271
|
-
*
|
|
272
|
-
*
|
|
273
|
-
* `
|
|
274
|
-
*
|
|
275
|
-
* children theme maps `xPrimary` → `x` and `xTertiary` (or `xSecondary`) →
|
|
276
|
-
* `xSubtle`. Light palettes are ordered lightest-first; dark palettes
|
|
277
|
-
* darkest-first.
|
|
243
|
+
* Light and dark token sets are emitted as a single config. Semantic colors
|
|
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 })`.
|
|
278
250
|
*
|
|
279
251
|
* Typography tokens (`$type: "typography"`) each emit their own Tamagui
|
|
280
252
|
* `createFont` entry with that token's size, line height, and weight. Font
|
|
281
253
|
* keys keep the DTCG token name (`display-lg`). Names with a `_` suffix (or a
|
|
282
254
|
* nested language segment) become FontLanguage variants (`body_cn`).
|
|
283
255
|
*
|
|
284
|
-
* @see https://tamagui.dev/docs/core/
|
|
256
|
+
* @see https://tamagui.dev/docs/core/configuration
|
|
257
|
+
* @see https://tamagui.dev/docs/intro/themes
|
|
285
258
|
* @see https://tamagui.dev/docs/core/font-language#font-tokens
|
|
286
259
|
*
|
|
287
260
|
* @example
|
|
@@ -296,5 +269,5 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
|
|
|
296
269
|
*/
|
|
297
270
|
declare const _default: (options?: TamaguiPluginOptions | undefined) => import("@razorwind/core/plugin").Plugin;
|
|
298
271
|
//#endregion
|
|
299
|
-
export { type FlatToken, type TamaguiAnimationDriver, type TamaguiFontDef, type TamaguiPluginOptions, type TamaguiTokenCategory,
|
|
272
|
+
export { type FlatToken, type TamaguiAnimationDriver, type TamaguiFontDef, type TamaguiPluginOptions, type TamaguiTokenCategory, collectTamaguiFonts, _default as default, flattenTokens, fontVarName, formatTokenValue, generateTamaguiConfig, isPaletteGroup, renderInstallMd, renderTamaguiConfig, resolveTokenCategory, resolveTokenSets, tamaguiFontKeyFromRole, toCamelCaseKey, toCssVar, toTamaguiValue, toTokenKey, typographyFontKey };
|
|
300
273
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.mjs
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
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,
|
|
3
|
-
`)}\n }`}function
|
|
4
|
-
`)}\n${r}}`}function
|
|
5
|
-
`)}\n});`}function
|
|
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(`,
|
|
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
|
+
`)}\n});`}function $e(e){return`# Installing Tamagui Config
|
|
6
6
|
|
|
7
7
|
Generated by \`@razorwind/tamagui\`.
|
|
8
8
|
|
|
9
9
|
## Files
|
|
10
10
|
|
|
11
|
-
- \`${e.outputPath}\` — Tamagui
|
|
11
|
+
- \`${e.outputPath}\` — Tamagui config (\`createTamagui\` + \`createTheme\` with light, dark, and nested semantic themes)
|
|
12
12
|
|
|
13
13
|
## Setup
|
|
14
14
|
|
|
@@ -48,51 +48,42 @@ 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
|
|
52
|
-
`)}\n${` `.repeat(Math.max(t-2,0))}}`}function
|
|
53
|
-
`)}\n${` `.repeat(Math.max(t-2,0))}}`}function wt(e,t=
|
|
54
|
-
`)}\n
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
...tokens.radius
|
|
78
|
-
},
|
|
79
|
-
zIndex: {
|
|
80
|
-
...defaultConfig.tokens.zIndex,
|
|
81
|
-
...tokens.zIndex
|
|
82
|
-
}
|
|
83
|
-
}`):A.push(` tokens`)),A.push(` themes`),fe.size>0){let e=[...fe.entries()].map(([e,t])=>` ${/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}: ${t}`);i?A.push(` fonts: {
|
|
84
|
-
...defaultConfig.fonts,
|
|
85
|
-
${e.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?k([t]):e.tokenKey}return e.tokenKey??``}function pt(e,t){let n=Q(e,t.byPath,t.byCssVar).tamaguiValue;if(e.category&<.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(`,
|
|
55
|
+
`),`});`,``),_.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
|
+
...defaultConfig.tokens,
|
|
57
|
+
...tokens,
|
|
58
|
+
space: {
|
|
59
|
+
...defaultConfig.tokens.space,
|
|
60
|
+
...tokens.space
|
|
61
|
+
},
|
|
62
|
+
size: {
|
|
63
|
+
...defaultConfig.tokens.size,
|
|
64
|
+
...tokens.size
|
|
65
|
+
},
|
|
66
|
+
radius: {
|
|
67
|
+
...defaultConfig.tokens.radius,
|
|
68
|
+
...tokens.radius
|
|
69
|
+
},
|
|
70
|
+
zIndex: {
|
|
71
|
+
...defaultConfig.tokens.zIndex,
|
|
72
|
+
...tokens.zIndex
|
|
73
|
+
}
|
|
74
|
+
}`):D.push(` tokens`)),v&&D.push(` themes`),E.size>0){let e=[...E.entries()].map(([e,t])=>` ${/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}: ${t}`);i?D.push(` fonts: {
|
|
75
|
+
...defaultConfig.fonts,
|
|
76
|
+
${e.join(`,
|
|
86
77
|
`)}
|
|
87
|
-
|
|
88
|
-
${e.join(`,
|
|
78
|
+
}`):D.push(` fonts: {
|
|
79
|
+
${e.join(`,
|
|
89
80
|
`)}
|
|
90
|
-
|
|
91
|
-
* The Tamagui
|
|
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??[],`/**
|
|
82
|
+
* The Tamagui config for the ${e.name||`design system`}.
|
|
92
83
|
*
|
|
93
|
-
* @see https://tamagui.dev/docs/core/
|
|
84
|
+
* @see https://tamagui.dev/docs/core/configuration
|
|
94
85
|
*/
|
|
95
|
-
export const config = createTamagui({`,
|
|
96
|
-
`),n.importConfig?`, ...userConfig `:``,`});`,``,`export type AppConfig = typeof config;`,``),o&&
|
|
97
|
-
`)}function
|
|
86
|
+
export const config = createTamagui({`,D.join(`,
|
|
87
|
+
`),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};
|
|
98
89
|
//# sourceMappingURL=index.mjs.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@razorwind/tamagui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.55",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Razorwind plugin that creates Tamagui theme tokens from Razorwind design tokens.",
|
|
6
6
|
"repository": {
|
|
@@ -85,7 +85,7 @@
|
|
|
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.
|
|
88
|
+
"@razorwind/core": "^0.0.58",
|
|
89
89
|
"@stryke/type-checks": "^0.6.44",
|
|
90
90
|
"@stryke/helpers": "^0.10.51",
|
|
91
91
|
"@stryke/string-format": "^0.17.53"
|
|
@@ -106,5 +106,5 @@
|
|
|
106
106
|
"typescript": "^6.0.3"
|
|
107
107
|
},
|
|
108
108
|
"publishConfig": { "access": "public" },
|
|
109
|
-
"gitHead": "
|
|
109
|
+
"gitHead": "26304e8c6d927befb4b9ffdb28ae1cc7f88e45ca"
|
|
110
110
|
}
|