@razorwind/tamagui 0.0.40 → 0.0.42
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 +41 -26
- package/dist/index.d.cts +75 -8
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +75 -8
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +41 -26
- package/package.json +6 -4
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/
|
|
2
|
-
`,`\\n`).replaceAll(`\r`,`\\r`)}function
|
|
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"),i=require("@stryke/helpers/get-unique");function a(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`).replaceAll(`
|
|
2
|
+
`,`\\n`).replaceAll(`\r`,`\\r`)}function o(e){return typeof e==`string`?`"${a(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function s(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 c=/^(?:font-size|fontSize)(?:\.|$)/i,l=/^(?:font-weight|fontWeight)(?:\.|$)/i,u=/^shadow(?:\.|$)/i,d=/^inset-shadow(?:\.|$)/i,f=/^drop-shadow(?:\.|$)/i,p=/^text-shadow(?:\.|$)/i,m=/^(?:blur|blur-?radius)(?:\.|$)/i,h=new Set([`color`,`shadow`,`insetShadow`,`dropShadow`,`textShadow`]),ee=[{prefix:/^(?:color|colours?|palette)(?:\.|$)/i,category:`color`},{prefix:c,category:`fontSize`},{prefix:l,category:`fontWeight`},{prefix:f,category:`dropShadow`},{prefix:d,category:`insetShadow`},{prefix:p,category:`textShadow`},{prefix:u,category:`shadow`},{prefix:m,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:S(e)===`palette`}function y(e,t){return(e===`palette`||e===`$palette`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function b(e){return e===!0||e===`true`||e===1}function te(e){return b(e.primitive)||b(e.$primitive)?!0:S(e)===`primitive`}function ne(e,t){return(e===`primitive`||e===`$primitive`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function x(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function S(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function C(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 w(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 d.test(e)?`insetShadow`:f.test(e)?`dropShadow`:p.test(e)?`textShadow`:`shadow`;if(t===`dimension`){if(c.test(e))return`fontSize`;if(m.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`||l.test(e))return`fontWeight`}function T(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(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`:T(r)}function D(e,n,r,i,a,o){if(!(0,t.isObject)(e))return;let c=a||te(e)||v(e),l=S(e,r);if(g(e)){let r=C(e),a=n.join(`.`),u=w(a,l)??(c||l===`primitive`||l===`palette`?`color`:void 0),d=(0,t.formatTokenValue)(r,l),f=u&&h.has(u)||l===`color`||l===`palette`||l===`primitive`||l===`shadow`?d:s(r,l);o.push({path:a,type:l===`palette`||l===`primitive`?`color`:l,value:r,cssValue:d,tamaguiValue:f,category:u,tokenKey:u?E(a):void 0,description:x(e),theme:i,primitive:c});return}for(let[t,r]of Object.entries(e))t.startsWith(`$`)&&t!==`$palette`&&t!==`$primitive`||y(t,r)||ne(t,r)||D(r,[...n,t],l,i,c,o)}function O(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;D(n.tokens,[],void 0,e,!1,i)}return r?i.filter(e=>!e.type||r.has(e.type)):i}const k=/^\{([^{}]+)\}$/,re=/^(?:typography|type|text)$/i,ie=/^(?:font|fonts|font-family|fontFamily)$/i,ae=/^(?:font-size|fontSize)$/i,oe=/^(?:font-weight|fontWeight)$/i,se=/^(?:line-height|lineHeight|leading)$/i,ce=/^(?:letter-spacing|letterSpacing|tracking)$/i,le=/^(?:[a-z]{2}(?:-[A-Z]{2})?|cn|zh|jp|ja|kr|ko|ar|he|th|hi|ru|french|mandarin|chinese|japanese|korean|arabic|hebrew)$/i,ue=[`fontFamily`,`font-family`,`family`],de=[`fontSize`,`font-size`,`size`],fe=[`fontWeight`,`font-weight`,`weight`],pe=[`lineHeight`,`line-height`,`leading`],me=[`letterSpacing`,`letter-spacing`,`tracking`],he={1:12,2:14,3:16,4:18,5:20,6:24,7:28,8:32,9:40,10:48};function A(e){if(typeof e==`string`)return k.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 ge(e){return(e.split(`,`)[0]?.trim()??e).replaceAll(/^["']|["']$/g,``)}function _e(e){if(typeof e==`string`){let t=e.trim();return t.length===0||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 ve(e){return Number.isInteger(e)?e:Math.round(e*1e3)/1e3}function N(e){if(e==null)return;let t=s(e);if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=/^(-?\d+(?:\.\d+)?)%$/.exec(t.trim());if(e)return Number.parseFloat(e[1])/100}}function ye(e){if(typeof e==`number`&&Number.isFinite(e))return String(e);if(typeof e==`string`){let t=e.trim();if(t.length===0||A(t))return;let n=Number(t);return Number.isNaN(n)?t:String(n)}let t=s(e);if(typeof t==`number`&&Number.isFinite(t))return String(t);if(typeof t==`string`&&t.length>0)return t}function be(e,t){let n=N(e);if(n!=null)return ve(t!=null&&n>0&&n<=4?n*t:n)}function P(e,t){return t.test(e.split(`.`)[0]??``)}function xe(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`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 I([e])}}function Se(e){return e.role?L(e.role):L(e.name)}function Ce(e){let t=F(e,re);if(t.length===0)return`body`;let n=t.at(-1);return n&&t.length>=2&&le.test(n)&&!n.includes(`_`)?`${I(t.slice(0,-1))}_${n}`:I(t)}function we(e){return L(F(e,ie)[0]??xe(e))}function R(e,t){let n=F(e,t);return n.length===0||n.length===1&&/^(?:DEFAULT|default)$/i.test(n[0])?`true`:I(n)}function Te(e){return e.type===`typography`&&(0,t.isObject)(e.value)}function Ee(e){return e.category===`fontSize`||e.category===`fontWeight`||De(e)||Oe(e)||ke(e)||Ae(e)?!1:e.type===`fontFamily`||P(e.path,ie)}function De(e){return e.category===`fontSize`||P(e.path,ae)}function Oe(e){return e.category===`fontWeight`||e.type===`fontWeight`||P(e.path,oe)}function ke(e){return P(e.path,se)}function Ae(e){return P(e.path,ce)}function je(e){let t=new Map;for(let n of Object.values(e)){let e=Se(n),r=t.get(e);(!r||n.role===e&&r.role!==e)&&t.set(e,n)}return t}function Me(e,t,n){if(!e)return;let i=Object.values(e);if(i.length===0)return;if(n){let e=n.split(`.`).filter(Boolean).at(-1);if(e){let t=i.find(t=>t.role===e||t.name.toLowerCase()===e.toLowerCase());if(t)return t}}if(!t)return;let a=ge(t).toLowerCase();return i.find(e=>(0,r.fontFamilyName)(e).toLowerCase()===a||e.title.toLowerCase()===a||e.name.toLowerCase()===a)}function Ne(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: ${o(t.normal)}`),t.italic&&n.push(`italic: ${o(t.italic)}`),` ${e}: { ${n.join(`, `)} }`}).join(`,
|
|
3
|
+
`)}\n }`}function z(e,t){return{...e,webFamily:(0,r.cssFontFamily)(t),nativeFamily:(0,r.fontFamilyName)(t),face:t.source===`local`?Ne(t):e.face}}function B(e){return{key:e,webFamily:`system-ui, sans-serif`,nativeFamily:`system-ui`,size:{},lineHeight:{},weight:{},letterSpacing:{}}}function Pe(e,t){return{...e,webFamily:t,nativeFamily:ge(t)}}function Fe(e,t){let n={},r=[],i={},a={};for(let o of e){if(De(o)){let e=N(j(o.value,t));e!=null&&(n[R(o.path,ae)]=e);continue}if(Oe(o)){let e=ye(j(o.value,t));e&&(i[R(o.path,oe)]=e);continue}if(Ae(o)){let e=N(j(o.value,t));e!=null&&(a[R(o.path,ce)]=e);continue}ke(o)&&r.push({key:R(o.path,se),value:j(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=be(e.value,t);r!=null&&(s[e.key]=r)}return{size:n,lineHeight:s,weight:i,letterSpacing:a}}function V(e,t){return{...t,...e}}function H(e,t){return{...e,size:V(e.size,t.size),lineHeight:V(e.lineHeight,t.lineHeight),weight:V(e.weight,t.weight),letterSpacing:V(e.letterSpacing,t.letterSpacing)}}function Ie(e){return Object.keys(e.size).length>0?e:{...e,size:{...he}}}function Le(e,n,r,i){if(!(0,t.isObject)(n.value))return e;let a=M(n.value,ue),o=A(a),s=_e(j(a,r)),c=Me(i,s,o),l=e;c?l=z(l,c):s&&(l=Pe(l,s));let u=N(j(M(n.value,de),r));u!=null&&(l={...l,size:{...l.size,true:u}});let d=ye(j(M(n.value,fe),r));d&&(l={...l,weight:{...l.weight,true:d}});let f=N(j(M(n.value,me),r));f!=null&&(l={...l,letterSpacing:{...l.letterSpacing,true:f}});let p=be(j(M(n.value,pe),r),l.size.true??u);return p!=null&&(l={...l,lineHeight:{...l.lineHeight,true:p}}),l}function Re(e,t){let n=new Map(e.map(e=>[e.path,e])),r=Fe(e,n),a=new Map,o=e=>{a.set(e.key,e)};if(t)for(let[e,n]of je(t))o(H(z(B(e),n),r));for(let i of e){if(!Ee(i)||Te(i))continue;let e=we(i.path),s=_e(j(i.value,n)),c=a.get(e)??B(e),l=Me(t,s,i.path),u=c;l?u=z(u,l):(s&&c.webFamily===B(e).webFamily||s&&!a.has(e))&&(u=Pe(u,s)),o(H(u,r))}for(let i of e){if(!Te(i))continue;let e=Ce(i.path);o(Le(H(a.get(e)??B(e),r),i,n,t))}return(0,i.getUniqueBy)([...a.values()].map(Ie).toSorted((e,t)=>e.key.localeCompare(t.key)),e=>e.key)}function ze(e){return/^\d+$/.test(e)||/^[A-Z_$][\w$]*$/i.test(e)?e:o(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}${ze(e)}: ${o(t)}`).join(`,
|
|
4
|
+
`)}\n${r}}`}function Be(e,t){let n=`${e.replaceAll(/\W/g,``)||`font${t}`}Font`;return/^[A-Z_]/i.test(n)?n:`font${t}`}function Ve(e,t){let n=o(e.webFamily),r=o(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 He(e){return`# Installing Tamagui Config
|
|
3
6
|
|
|
4
7
|
Generated by \`@razorwind/tamagui\`.
|
|
5
8
|
|
|
@@ -32,32 +35,34 @@ export function App() {
|
|
|
32
35
|
}
|
|
33
36
|
\`\`\`
|
|
34
37
|
|
|
35
|
-
3. Use
|
|
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
|
|
41
|
-
`)}\n${` `.repeat(Math.max(t-2,0))}}`}function
|
|
42
|
-
|
|
43
|
-
|
|
51
|
+
`}const Ue=new Set([`default`,`light`,`theme`]),We=/^base(?:[A-Z]\w*|[._-].+)?$/i,Ge=[`base`,`gray`,`grey`,`neutral`],Ke={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function qe(e){return Ue.has(e)}function Je(e){return e===`dark`}function W(e,t){let n=new Map,r=t===`dark`?Je:qe;for(let t of e){let e=t.theme?.toLowerCase();(!e||We.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 Ye=new Set([`fontSize`,`blur`]),Xe=[`space`,`size`,`radius`,`zIndex`,`blur`,`fontSize`,`shadow`,`insetShadow`,`dropShadow`,`textShadow`,`boxShadow`,`fontWeight`];function Ze(e){return/^px\(-?\d/.test(e)}function Qe(e){if(e.category===`radius`&&e.tokenKey?.startsWith(`borderRadius`)){let t=e.tokenKey.replace(/^borderRadius/,``);return t?T([t]):e.tokenKey}return e.tokenKey??``}function $e(e){return e.category&&Ye.has(e.category)&&typeof e.tamaguiValue==`number`?`px(${e.tamaguiValue})`:e.category===`dropShadow`&&typeof e.tamaguiValue==`string`?et(e.tamaguiValue):e.tamaguiValue}function et(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 tt(e){let t={};for(let n of e){if(!n.category||n.category===`color`||!n.tokenKey)continue;let e=Qe(n);if(!e)continue;let r=t[n.category]??{};r[e]=$e(n),t[n.category]=r}return t}function nt(e,t){let n={},r=(e,t)=>{let r=t.cssValue;typeof r!=`string`||r.length===0||q(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.primitive?r(i(t),t):r(t.tokenKey,t));for(let e of t)!e.tokenKey||!e.primitive||r(i(e),e);return n}function G(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`&&Ze(t)?t:o(t);return`${n}${/^[A-Z_$][\w$]*$/i.test(e)?e:o(e)}: ${r}`}).join(`,
|
|
52
|
+
`)}\n${` `.repeat(Math.max(t-2,0))}}`}function rt(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:o(e)}: ${t}`).join(`,
|
|
53
|
+
`)}\n${r}}`}const it=/^\{([^{}]+)\}$/,at=/^var\((--[^),\s]+)(?:\s*,[^)]*)?\)$/;function ot(e){if(typeof e==`string`)return it.exec(e.trim())?.[1]?.trim()}function K(e){if(typeof e==`string`)return at.exec(e.trim())?.[1]}function q(e){return ot(e)!=null||K(e)!=null}function st(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=ot(r.value);if(e){let n=t.get(e);if(!n||n.path===r.path)return r;r=n;continue}let a=K(r.value)??K(r.cssValue)??K(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 ct(e){return/^[A-Z_$][\w$]*$/i.test(e)?`theme.${e}`:`theme[${o(e)}]`}function lt(e,t,n){let r=J(e);if(r){if(t&&r.name.toLowerCase()===t.toLowerCase())return`color${r.step}`;if(n[r.name])return`${r.name}${r.step}`}}function ut(e){if(e>=1&&e<=12)return e;if(e>=100&&e<=900&&e%100==0)return e/100}function J(e){let t=e.path.split(`.`).filter(Boolean),n=t.at(-1);if(n&&/^\d+$/.test(n)){let e=ut(Number(n)),r=t.at(-2);if(e!=null&&r&&!/^(?:color|colours?|palette)$/i.test(r))return{name:T([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=ut(Number(a));if(o!=null)return{name:i,step:o}}function dt(e,t,n,r){let i=e[t]??{};i[`${t}${n}`]=r,e[t]=i}function ft(e){let t={};for(let n of e){if(typeof n.tamaguiValue!=`string`)continue;let e=J(n);e&&dt(t,e.name,e.step,n.tamaguiValue)}return Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=3))}function Y(e){let t={};for(let n of e){if(!n.primitive||typeof n.tamaguiValue!=`string`)continue;let e=J(n);e&&dt(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:ft(e)}function X(e,t){if(e.length<2)return[...e];let n=$(e[0]),r=$(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 Z(e){return e<=.04045?e/12.92:((e+.055)/1.055)**2.4}function pt(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*Z(n)+.7152*Z(r)+.0722*Z(i)}function Q(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 mt(e){return e>1?e/100:e}function ht(e,t){let n=RegExp(`^${t}\\((.+)\\)$`,`i`).exec(e.trim());if(n?.[1])return n[1].split(/[\s,/]+/).filter(Boolean)}function $(e){let t=e.trim();if(!t||t.startsWith(`var(`)||t.includes(`{`))return;let n=pt(t);if(n!=null)return n;let r=ht(t,`oklch`);if(r?.[0]){let e=Q(r[0]);return e==null?void 0:mt(e)}let i=ht(t,`hsla?`);if(i?.[2]){let e=Q(i[2]);return e==null?void 0:mt(e)}let a=ht(t,`rgba?`);if(a?.[0]&&a[1]&&a[2]){let e=Q(a[0]),t=Q(a[1]),n=Q(a[2]);if(e==null||t==null||n==null)return;let r=(e,t)=>t.trim().endsWith(`%`)||e<=1?e:e/255;return .2126*Z(r(e,a[0]))+.7152*Z(r(t,a[1]))+.0722*Z(r(n,a[2]))}}function gt(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 _t(e,t,n){let r=gt(e,t);if(r.length===0)return e;let i=X(r.map(([,e])=>e),n),a={};for(let[e,[n]]of r.entries())a[`${t}${n}`]=i[e]??r[e][1];return a}function vt(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 yt(e,t,n){let r=gt(e,t);if(!(r.length<2))return vt(X(r.map(([,e])=>e),n))}function bt(e,t){let n=new Map(Object.entries(e).map(([e,t])=>[e.toLowerCase(),{name:e,scale:t}]));for(let e of Ge){let r=n.get(e);if(!r)continue;let i=yt(r.scale,r.name,t);if(i)return{name:r.name,palette:i}}}function xt(e){let t=e.filter(e=>e.category===`color`||e.primitive),n=Y(W(t,`light`)),r=Y(W(t,`dark`)),i=bt(n,`light`),a=bt(r,`dark`);return{lightPalette:i?.palette,darkPalette:a?.palette,lightBaseName:i?.name,darkBaseName:a?.name}}function St(e,n){let r=Y(e),i=new Map(e.map(e=>[e.path,e])),a=new Map(e.map(e=>[(0,t.toThemeCssVar)(e.path),e])),s={};for(let t of e){if(t.category!==`color`||!t.tokenKey||t.primitive||/^[A-Z]+\d{1,3}$/i.test(t.tokenKey)&&r[t.tokenKey.replace(/\d{1,3}$/,``)])continue;let e=st(t,i,a),c=lt(e,n,r);if(c){s[t.tokenKey]=ct(c);continue}let l=e.tamaguiValue;q(l)||q(e.cssValue)||(typeof l==`string`||typeof l==`number`)&&(s[t.tokenKey]=o(l))}return s}function Ct(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=_t(e[i]??t[i]??{},i,`light`),a=_t(t[i]??e[i]??{},i,`dark`);Object.keys(n).length!==0&&Object.keys(a).length!==0&&r.push(` ${i}: {
|
|
54
|
+
light: ${G(n,8)},
|
|
55
|
+
dark: ${G(a,8)}
|
|
44
56
|
}`)}if(r.length!==0)return`{\n${r.join(`,
|
|
45
|
-
`)}\n }`}function
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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 wt(e){let t=new Set;for(let n of e)for(let e of Object.values(n)){for(let n of e.matchAll(/theme\.([A-Z_$][\w$]*)/gi))n[1]&&t.add(n[1]);for(let n of e.matchAll(/theme\[(['"])(.+?)\1\]/g))t.add(n[2])}return[...t]}function Tt(e,t){let n=new Set;for(let r of[e,t])for(let e of Object.values(r))for(let t of Object.keys(e))n.add(t);return[...n]}function Et(e,t){let n=Math.max(e?.length??0,t?.length??0);if(n===0)return[];let r=[];for(let e=1;e<=Math.min(n,12);e++)r.push(`color${e}`);return r}function Dt(e){let t=new Set;for(let n of Object.keys(e.lightSemantic))t.add(n);for(let n of Object.keys(e.darkSemantic))t.add(n);for(let n of wt([e.lightSemantic,e.darkSemantic]))t.add(n);for(let n of Tt(e.lightScales,e.darkScales))t.add(n);for(let n of Et(e.lightPalette,e.darkPalette))t.add(n);return[...t].toSorted((e,t)=>e.localeCompare(t,void 0,{numeric:!0}))}function Ot(e){return` ${/^[A-Z_$][\w$]*$/i.test(e)?e:o(e)}: string;`}function kt(e,t){if(e.length!==0)return[`/**`,` * Theme values available on \`useTheme()\` and \`$\` style props for the ${t.specName||`design system`}.`,` *`," * Derived from design tokens mapped by `createV5Theme` and `getTheme`.",` *`,` * @see https://tamagui.dev/docs/guides/theme-builder#gettheme`,` */`,`export interface AppTheme {`,...e.map(Ot),`}`,``]}function At(e,t,n={}){let r=e.fonts??{},i=n.useDefaultConfig!==!1,a=n.animations??`css`,s=n.includeTypeAugmentation!==!1,c=t.filter(e=>e.category===`color`),l=W(c,`light`),u=W(c,`dark`),d=Y(l),f=Y(u.length>0?u:l),{lightPalette:p,darkPalette:m,lightBaseName:h,darkBaseName:ee}=xt(t),g=Ct(d,f),_=St(l,h),v=St(u.length>0?u:l,u.length>0?ee:h),y=kt(Dt({lightSemantic:_,darkSemantic:v,lightScales:d,darkScales:f,lightPalette:p,darkPalette:m}),{specName:e.name}),b=y?`AppTheme`:`Record<string, string>`,te=tt(W(t,`light`)),ne=nt(l,u),x=[];Object.keys(ne).length>0&&x.push(` color: ${G(ne,4)}`);for(let e of Xe){let t=te[e];t&&Object.keys(t).length>0&&x.push(` ${e}: ${G(t,4)}`)}let S=[];p&&S.push(` lightPalette: ${o(p)}`),m&&S.push(` darkPalette: ${o(m)}`),g&&S.push(` childrenThemes: ${g}`),(Object.keys(_).length>0||Object.keys(v).length>0)&&S.push(` getTheme: ({ theme, scheme }: { theme: ${b}; scheme: "light" | "dark" }) => {
|
|
58
|
+
return scheme === "dark"
|
|
59
|
+
? ${rt(v,8)}
|
|
60
|
+
: ${rt(_,8)};
|
|
61
|
+
}`);let C=[`import { isWeb } from '@tamagui/constants';`];i?C.push(`import { createV5Theme, defaultConfig, type CreateV5ThemeOptions } from "@tamagui/config/v5";`):C.push(`import { createV5Theme, type CreateV5ThemeOptions } from "@tamagui/config/v5";`),a!==!1&&C.push(`import { animations } from "${Ke[a]}";`);let w=[`createTamagui`,`px`];x.length>0&&w.push(`createTokens`);let T=Re(W(t,`light`),r);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=Be(t.key,e);O.set(t.key,n),E.push(Ve(t,n),``)}let k=[];if(i&&k.push(` ...defaultConfig`),a!==!1&&k.push(` animations`),x.length>0&&(i?k.push(` tokens: {
|
|
55
64
|
...defaultConfig.tokens,
|
|
56
65
|
...tokens,
|
|
57
|
-
color: {
|
|
58
|
-
...defaultConfig.tokens.color,
|
|
59
|
-
...tokens.color
|
|
60
|
-
},
|
|
61
66
|
space: {
|
|
62
67
|
...defaultConfig.tokens.space,
|
|
63
68
|
...tokens.space
|
|
@@ -74,13 +79,23 @@ Re-run Razorwind generate when tokens change so \`${e.outputPath}\` stays aligne
|
|
|
74
79
|
...defaultConfig.tokens.zIndex,
|
|
75
80
|
...tokens.zIndex
|
|
76
81
|
}
|
|
77
|
-
}`):
|
|
82
|
+
}`):k.push(` tokens`)),k.push(` themes`),O.size>0){let e=[...O.entries()].map(([e,t])=>` ${/^[A-Z_$][\w$]*$/i.test(e)?e:o(e)}: ${t}`);i?k.push(` fonts: {
|
|
78
83
|
...defaultConfig.fonts,
|
|
79
84
|
${e.join(`,
|
|
80
85
|
`)}
|
|
81
|
-
}`):
|
|
86
|
+
}`):k.push(` fonts: {
|
|
82
87
|
${e.join(`,
|
|
83
88
|
`)}
|
|
84
|
-
}`)}return
|
|
85
|
-
|
|
86
|
-
|
|
89
|
+
}`)}return n.shorthands&&k.push(` shorthands: ${G(n.shorthands,4)}`),n.media&&k.push(` media: ${o(n.media)}`),k.push(` selectionStyles(theme: ${b}) {
|
|
90
|
+
return {
|
|
91
|
+
backgroundColor: theme.color.background.primary,
|
|
92
|
+
color: theme.color.text.primary
|
|
93
|
+
};
|
|
94
|
+
} `),n.defaultFont&&k.push(` defaultFont: ${o(n.defaultFont)}`),E.push(``,...y??[],`/**
|
|
95
|
+
* The Tamagui v5 config for the ${e.name||`design system`}.
|
|
96
|
+
*
|
|
97
|
+
* @see https://tamagui.dev/docs/core/config-v5
|
|
98
|
+
*/
|
|
99
|
+
export const config = createTamagui({`,k.join(`,
|
|
100
|
+
`),`});`,``,`export type AppConfig = typeof config;`,``),s&&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(`
|
|
101
|
+
`)}function jt(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?O(e.tokens,r):[];if(o.length===0&&!a)return{};let s=r.outputPath??`tamagui.config.ts`,c=At(e,o,r),l=r.installGuide??He({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 Mt=(0,e.definePlugin)(e=>({name:`tamagui`,themeGeneration:`combined`,generate:async t=>jt(t,e??{})}));exports.collectColorScales=Y,exports.collectTamaguiFonts=Re,exports.colorLightness=$,exports.default=Mt,exports.flattenTokens=O,exports.fontVarName=Be,Object.defineProperty(exports,"formatTokenValue",{enumerable:!0,get:function(){return t.formatTokenValue}}),exports.generateTamaguiConfig=jt,exports.isPaletteGroup=v,exports.orderPaletteForScheme=X,exports.renderInstallMd=He,exports.renderTamaguiConfig=At,exports.resolveTokenCategory=w,exports.resolveTokenSets=t.resolveTokenSets,exports.tamaguiFontKeyFromRole=L,exports.toCamelCaseKey=T,Object.defineProperty(exports,"toCssVar",{enumerable:!0,get:function(){return t.toCssVar}}),exports.toTamaguiValue=s,exports.toTokenKey=E,exports.typographyFontKey=Ce;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { TokenType } from "@power-plant/dtcg-schema";
|
|
2
|
+
import { CreateTamaguiProps } from "tamagui";
|
|
2
3
|
import { Fonts, Schema, Tokens } from "@razorwind/core/schema";
|
|
3
4
|
import { formatTokenValue, resolveTokenSets, toCssVar } from "@razorwind/core/utils";
|
|
4
5
|
import { GeneratorFunctionResult } from "@power-plant/core";
|
|
@@ -12,7 +13,7 @@ type TamaguiAnimationDriver = "css" | "rn" | "reanimated" | "motion" | false;
|
|
|
12
13
|
/**
|
|
13
14
|
* Tamagui `createTokens` category keys we emit from DTCG tokens.
|
|
14
15
|
*/
|
|
15
|
-
type TamaguiTokenCategory = "color" | "space" | "size" | "radius" | "zIndex";
|
|
16
|
+
type TamaguiTokenCategory = "color" | "space" | "size" | "radius" | "zIndex" | "blur" | "fontSize" | "shadow" | "insetShadow" | "dropShadow" | "textShadow" | "fontWeight" | "boxShadow";
|
|
16
17
|
/**
|
|
17
18
|
* Options for the Razorwind Tamagui config generator.
|
|
18
19
|
*/
|
|
@@ -33,6 +34,22 @@ interface TamaguiPluginOptions {
|
|
|
33
34
|
* @defaultValue `"css"`
|
|
34
35
|
*/
|
|
35
36
|
animations?: TamaguiAnimationDriver;
|
|
37
|
+
/**
|
|
38
|
+
* Shorthands to include in the generated config.
|
|
39
|
+
*
|
|
40
|
+
* @defaultValue `{}`
|
|
41
|
+
*/
|
|
42
|
+
shorthands?: Record<string, string | number>;
|
|
43
|
+
/**
|
|
44
|
+
* Media queries to include in the generated config.
|
|
45
|
+
*
|
|
46
|
+
* @defaultValue `{}`
|
|
47
|
+
*/
|
|
48
|
+
media?: CreateTamaguiProps["media"];
|
|
49
|
+
/**
|
|
50
|
+
* Default font family to include in the generated config.
|
|
51
|
+
*/
|
|
52
|
+
defaultFont?: string;
|
|
36
53
|
/**
|
|
37
54
|
* When true, spread `defaultConfig` from `@tamagui/config/v5` and merge
|
|
38
55
|
* generated tokens/themes on top. When false, emit a minimal config from
|
|
@@ -82,11 +99,9 @@ interface FlatToken {
|
|
|
82
99
|
/** Theme / set id when tokens are a `Record<string, Tokens>`. */
|
|
83
100
|
theme?: string;
|
|
84
101
|
/**
|
|
85
|
-
* True when an ancestor group is marked as a
|
|
86
|
-
* `$type: "palette"`). Those scales feed Tamagui `childrenThemes` /
|
|
87
|
-
* `lightPalette` / `darkPalette`.
|
|
102
|
+
* True when an ancestor group is marked as a primitive (`primitive: true` or `$type: "primitive"` or `$type: "palette"`). Those scales feed Tamagui `childrenThemes` / `lightPalette` / `darkPalette`.
|
|
88
103
|
*/
|
|
89
|
-
|
|
104
|
+
primitive?: boolean;
|
|
90
105
|
}
|
|
91
106
|
//#endregion
|
|
92
107
|
//#region src/flatten.d.ts
|
|
@@ -120,6 +135,51 @@ declare function toTokenKey(path: string): string;
|
|
|
120
135
|
*/
|
|
121
136
|
declare function flattenTokens(tokens: Tokens | Record<string, Tokens>, options?: Pick<TamaguiPluginOptions, "includeTypes">): FlatToken[];
|
|
122
137
|
//#endregion
|
|
138
|
+
//#region src/fonts.d.ts
|
|
139
|
+
/**
|
|
140
|
+
* A Tamagui `createFont` definition assembled from DTCG typography tokens,
|
|
141
|
+
* font-family tokens, and `spec.fonts`.
|
|
142
|
+
*
|
|
143
|
+
* @see https://tamagui.dev/docs/core/font-language#font-tokens
|
|
144
|
+
*/
|
|
145
|
+
interface TamaguiFontDef {
|
|
146
|
+
/** Tamagui `fonts` object key (`body`, `heading`, `body_cn`, …). */
|
|
147
|
+
key: string;
|
|
148
|
+
/** CSS font-family stack used when `isWeb` is true. */
|
|
149
|
+
webFamily: string;
|
|
150
|
+
/** Family name used on native. */
|
|
151
|
+
nativeFamily: string;
|
|
152
|
+
size: Record<string, number>;
|
|
153
|
+
lineHeight: Record<string, number>;
|
|
154
|
+
weight: Record<string, string>;
|
|
155
|
+
letterSpacing: Record<string, number>;
|
|
156
|
+
/** Rendered `face` object literal for local fonts, when present. */
|
|
157
|
+
face?: string;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Map a font role / family token name onto Tamagui's `body` / `heading` /
|
|
161
|
+
* `mono` keys.
|
|
162
|
+
*/
|
|
163
|
+
declare function tamaguiFontKeyFromRole(name: string): string;
|
|
164
|
+
/**
|
|
165
|
+
* Tamagui font key for a typography token. Nested language segments and
|
|
166
|
+
* `body_cn`-style names keep the `_` separator FontLanguage expects.
|
|
167
|
+
*
|
|
168
|
+
* @see https://tamagui.dev/docs/core/font-language
|
|
169
|
+
*/
|
|
170
|
+
declare function typographyFontKey(path: string): string;
|
|
171
|
+
/**
|
|
172
|
+
* Build Tamagui font definitions from typography tokens, font-family tokens,
|
|
173
|
+
* and `spec.fonts`. Each resulting entry is emitted via `createFont`.
|
|
174
|
+
*
|
|
175
|
+
* @see https://tamagui.dev/docs/core/font-language#font-tokens
|
|
176
|
+
*/
|
|
177
|
+
declare function collectTamaguiFonts(tokens: FlatToken[], fonts?: Fonts): TamaguiFontDef[];
|
|
178
|
+
/**
|
|
179
|
+
* Valid JS identifier used for the `const <name> = createFont(...)` binding.
|
|
180
|
+
*/
|
|
181
|
+
declare function fontVarName(key: string, index: number): string;
|
|
182
|
+
//#endregion
|
|
123
183
|
//#region src/format.d.ts
|
|
124
184
|
/**
|
|
125
185
|
* Convert a DTCG `$value` into a Tamagui token primitive.
|
|
@@ -164,10 +224,12 @@ declare function colorLightness(color: string): number | undefined;
|
|
|
164
224
|
* Render a Tamagui v5 config module from flattened design tokens.
|
|
165
225
|
*
|
|
166
226
|
* Light and dark token sets are combined into one `createV5Theme` call.
|
|
227
|
+
* Typography and font-family tokens are emitted as `createFont` entries.
|
|
167
228
|
*
|
|
168
229
|
* @see https://tamagui.dev/docs/core/config-v5
|
|
230
|
+
* @see https://tamagui.dev/docs/core/font-language#font-tokens
|
|
169
231
|
*/
|
|
170
|
-
declare function renderTamaguiConfig(tokens: FlatToken[], options?: TamaguiPluginOptions
|
|
232
|
+
declare function renderTamaguiConfig(spec: Schema, tokens: FlatToken[], options?: TamaguiPluginOptions): string;
|
|
171
233
|
/**
|
|
172
234
|
* Generate a Tamagui v5 config file from a Razorwind schema.
|
|
173
235
|
*/
|
|
@@ -176,7 +238,7 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
|
|
|
176
238
|
//#region src/index.d.ts
|
|
177
239
|
/**
|
|
178
240
|
* Razorwind plugin that turns design tokens into a Tamagui v5 config
|
|
179
|
-
* (`createTamagui` + `createTokens` + `createV5Theme`).
|
|
241
|
+
* (`createTamagui` + `createTokens` + `createV5Theme` + `createFont`).
|
|
180
242
|
*
|
|
181
243
|
* Light and dark token sets are emitted as a single config: `createV5Theme`
|
|
182
244
|
* receives both `lightPalette` / `darkPalette` and `childrenThemes` with
|
|
@@ -185,7 +247,12 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
|
|
|
185
247
|
* set `lightPalette` / `darkPalette` (`color1`–`color12`). Light palettes are
|
|
186
248
|
* ordered lightest-first; dark palettes darkest-first.
|
|
187
249
|
*
|
|
250
|
+
* Typography tokens (`$type: "typography"`) and font-family tokens each emit
|
|
251
|
+
* a Tamagui `createFont` entry. Names with a `_` suffix (or a nested language
|
|
252
|
+
* segment) become FontLanguage variants (`body_cn`).
|
|
253
|
+
*
|
|
188
254
|
* @see https://tamagui.dev/docs/core/config-v5
|
|
255
|
+
* @see https://tamagui.dev/docs/core/font-language#font-tokens
|
|
189
256
|
*
|
|
190
257
|
* @example
|
|
191
258
|
* ```ts
|
|
@@ -199,5 +266,5 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
|
|
|
199
266
|
*/
|
|
200
267
|
declare const _default: (options?: TamaguiPluginOptions | undefined) => import("@razorwind/core/plugin").Plugin;
|
|
201
268
|
//#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 };
|
|
269
|
+
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
270
|
//# 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/format.ts","../src/install.ts","../src/generate.ts","../src/index.ts"],"mappings":"
|
|
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;;;;;;;;EASA;;;;;EAMA,eAAe;;;;;;;EAQf;;;;;EAMA;;;;;UAMe;;EAEf;;EAEA,OAAO;;EAEP;;EAEA;;EAEA;;EAEA,WAAW;;EAEX;;EAEA;;EAEA;;;;EAIA;;;;;;;;;iBCtDc,eAAe,MAAM;;;;iBAuFrB,qBACd,cACA,gBACC;;;;;;;iBAoEa,eAAe;;;;;;;;iBA0Bf,WAAW;;;;iBA6FX,cACd,QAAQ,SAAS,eAAe,SAChC,UAAS,KAAK,wCACb;;;;;;;;;UCpSc;;EAEf;;EAEA;;EAEA;EACA,MAAM;EACN,YAAY;EACZ,QAAQ;EACR,eAAe;;EAEf;;;;;;iBAyLc,uBAAuB;;;;;;;iBAsCvB,kBAAkB;;;;;;;iBAkXlB,oBACd,QAAQ,aACR,QAAQ,QACP;;;;iBA0Fa,YAAY,aAAa;;;;;;;;;iBC7sBzB,eAAe,gBAAgB;;;;;;;;iBCnC/B,gBAAgB;EAAW;;;;KCiCtC;;;;;;;iBA0cW,mBACd,aAAa,cACZ,eAAe;;;;;;;iBAmCF,sBACd,2BACA,QAAQ;;;;;iBA+EM,eAAe;;;;;;;;;;iBA8af,oBACd,MAAM,QACN,QAAQ,aACR,UAAS;;;;iBAkQK,sBACd,MAAM,QACN,UAAS,uBACR,wBAAwB,QAAQ"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { formatTokenValue, resolveTokenSets, toCssVar } from "@razorwind/core/utils";
|
|
2
2
|
import { TokenType } from "@power-plant/dtcg-schema";
|
|
3
|
+
import { CreateTamaguiProps } from "tamagui";
|
|
3
4
|
import { Fonts, Schema, Tokens } from "@razorwind/core/schema";
|
|
4
5
|
import { GeneratorFunctionResult } from "@power-plant/core";
|
|
5
6
|
//#region src/types.d.ts
|
|
@@ -12,7 +13,7 @@ type TamaguiAnimationDriver = "css" | "rn" | "reanimated" | "motion" | false;
|
|
|
12
13
|
/**
|
|
13
14
|
* Tamagui `createTokens` category keys we emit from DTCG tokens.
|
|
14
15
|
*/
|
|
15
|
-
type TamaguiTokenCategory = "color" | "space" | "size" | "radius" | "zIndex";
|
|
16
|
+
type TamaguiTokenCategory = "color" | "space" | "size" | "radius" | "zIndex" | "blur" | "fontSize" | "shadow" | "insetShadow" | "dropShadow" | "textShadow" | "fontWeight" | "boxShadow";
|
|
16
17
|
/**
|
|
17
18
|
* Options for the Razorwind Tamagui config generator.
|
|
18
19
|
*/
|
|
@@ -33,6 +34,22 @@ interface TamaguiPluginOptions {
|
|
|
33
34
|
* @defaultValue `"css"`
|
|
34
35
|
*/
|
|
35
36
|
animations?: TamaguiAnimationDriver;
|
|
37
|
+
/**
|
|
38
|
+
* Shorthands to include in the generated config.
|
|
39
|
+
*
|
|
40
|
+
* @defaultValue `{}`
|
|
41
|
+
*/
|
|
42
|
+
shorthands?: Record<string, string | number>;
|
|
43
|
+
/**
|
|
44
|
+
* Media queries to include in the generated config.
|
|
45
|
+
*
|
|
46
|
+
* @defaultValue `{}`
|
|
47
|
+
*/
|
|
48
|
+
media?: CreateTamaguiProps["media"];
|
|
49
|
+
/**
|
|
50
|
+
* Default font family to include in the generated config.
|
|
51
|
+
*/
|
|
52
|
+
defaultFont?: string;
|
|
36
53
|
/**
|
|
37
54
|
* When true, spread `defaultConfig` from `@tamagui/config/v5` and merge
|
|
38
55
|
* generated tokens/themes on top. When false, emit a minimal config from
|
|
@@ -82,11 +99,9 @@ interface FlatToken {
|
|
|
82
99
|
/** Theme / set id when tokens are a `Record<string, Tokens>`. */
|
|
83
100
|
theme?: string;
|
|
84
101
|
/**
|
|
85
|
-
* True when an ancestor group is marked as a
|
|
86
|
-
* `$type: "palette"`). Those scales feed Tamagui `childrenThemes` /
|
|
87
|
-
* `lightPalette` / `darkPalette`.
|
|
102
|
+
* True when an ancestor group is marked as a primitive (`primitive: true` or `$type: "primitive"` or `$type: "palette"`). Those scales feed Tamagui `childrenThemes` / `lightPalette` / `darkPalette`.
|
|
88
103
|
*/
|
|
89
|
-
|
|
104
|
+
primitive?: boolean;
|
|
90
105
|
}
|
|
91
106
|
//#endregion
|
|
92
107
|
//#region src/flatten.d.ts
|
|
@@ -120,6 +135,51 @@ declare function toTokenKey(path: string): string;
|
|
|
120
135
|
*/
|
|
121
136
|
declare function flattenTokens(tokens: Tokens | Record<string, Tokens>, options?: Pick<TamaguiPluginOptions, "includeTypes">): FlatToken[];
|
|
122
137
|
//#endregion
|
|
138
|
+
//#region src/fonts.d.ts
|
|
139
|
+
/**
|
|
140
|
+
* A Tamagui `createFont` definition assembled from DTCG typography tokens,
|
|
141
|
+
* font-family tokens, and `spec.fonts`.
|
|
142
|
+
*
|
|
143
|
+
* @see https://tamagui.dev/docs/core/font-language#font-tokens
|
|
144
|
+
*/
|
|
145
|
+
interface TamaguiFontDef {
|
|
146
|
+
/** Tamagui `fonts` object key (`body`, `heading`, `body_cn`, …). */
|
|
147
|
+
key: string;
|
|
148
|
+
/** CSS font-family stack used when `isWeb` is true. */
|
|
149
|
+
webFamily: string;
|
|
150
|
+
/** Family name used on native. */
|
|
151
|
+
nativeFamily: string;
|
|
152
|
+
size: Record<string, number>;
|
|
153
|
+
lineHeight: Record<string, number>;
|
|
154
|
+
weight: Record<string, string>;
|
|
155
|
+
letterSpacing: Record<string, number>;
|
|
156
|
+
/** Rendered `face` object literal for local fonts, when present. */
|
|
157
|
+
face?: string;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Map a font role / family token name onto Tamagui's `body` / `heading` /
|
|
161
|
+
* `mono` keys.
|
|
162
|
+
*/
|
|
163
|
+
declare function tamaguiFontKeyFromRole(name: string): string;
|
|
164
|
+
/**
|
|
165
|
+
* Tamagui font key for a typography token. Nested language segments and
|
|
166
|
+
* `body_cn`-style names keep the `_` separator FontLanguage expects.
|
|
167
|
+
*
|
|
168
|
+
* @see https://tamagui.dev/docs/core/font-language
|
|
169
|
+
*/
|
|
170
|
+
declare function typographyFontKey(path: string): string;
|
|
171
|
+
/**
|
|
172
|
+
* Build Tamagui font definitions from typography tokens, font-family tokens,
|
|
173
|
+
* and `spec.fonts`. Each resulting entry is emitted via `createFont`.
|
|
174
|
+
*
|
|
175
|
+
* @see https://tamagui.dev/docs/core/font-language#font-tokens
|
|
176
|
+
*/
|
|
177
|
+
declare function collectTamaguiFonts(tokens: FlatToken[], fonts?: Fonts): TamaguiFontDef[];
|
|
178
|
+
/**
|
|
179
|
+
* Valid JS identifier used for the `const <name> = createFont(...)` binding.
|
|
180
|
+
*/
|
|
181
|
+
declare function fontVarName(key: string, index: number): string;
|
|
182
|
+
//#endregion
|
|
123
183
|
//#region src/format.d.ts
|
|
124
184
|
/**
|
|
125
185
|
* Convert a DTCG `$value` into a Tamagui token primitive.
|
|
@@ -164,10 +224,12 @@ declare function colorLightness(color: string): number | undefined;
|
|
|
164
224
|
* Render a Tamagui v5 config module from flattened design tokens.
|
|
165
225
|
*
|
|
166
226
|
* Light and dark token sets are combined into one `createV5Theme` call.
|
|
227
|
+
* Typography and font-family tokens are emitted as `createFont` entries.
|
|
167
228
|
*
|
|
168
229
|
* @see https://tamagui.dev/docs/core/config-v5
|
|
230
|
+
* @see https://tamagui.dev/docs/core/font-language#font-tokens
|
|
169
231
|
*/
|
|
170
|
-
declare function renderTamaguiConfig(tokens: FlatToken[], options?: TamaguiPluginOptions
|
|
232
|
+
declare function renderTamaguiConfig(spec: Schema, tokens: FlatToken[], options?: TamaguiPluginOptions): string;
|
|
171
233
|
/**
|
|
172
234
|
* Generate a Tamagui v5 config file from a Razorwind schema.
|
|
173
235
|
*/
|
|
@@ -176,7 +238,7 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
|
|
|
176
238
|
//#region src/index.d.ts
|
|
177
239
|
/**
|
|
178
240
|
* Razorwind plugin that turns design tokens into a Tamagui v5 config
|
|
179
|
-
* (`createTamagui` + `createTokens` + `createV5Theme`).
|
|
241
|
+
* (`createTamagui` + `createTokens` + `createV5Theme` + `createFont`).
|
|
180
242
|
*
|
|
181
243
|
* Light and dark token sets are emitted as a single config: `createV5Theme`
|
|
182
244
|
* receives both `lightPalette` / `darkPalette` and `childrenThemes` with
|
|
@@ -185,7 +247,12 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
|
|
|
185
247
|
* set `lightPalette` / `darkPalette` (`color1`–`color12`). Light palettes are
|
|
186
248
|
* ordered lightest-first; dark palettes darkest-first.
|
|
187
249
|
*
|
|
250
|
+
* Typography tokens (`$type: "typography"`) and font-family tokens each emit
|
|
251
|
+
* a Tamagui `createFont` entry. Names with a `_` suffix (or a nested language
|
|
252
|
+
* segment) become FontLanguage variants (`body_cn`).
|
|
253
|
+
*
|
|
188
254
|
* @see https://tamagui.dev/docs/core/config-v5
|
|
255
|
+
* @see https://tamagui.dev/docs/core/font-language#font-tokens
|
|
189
256
|
*
|
|
190
257
|
* @example
|
|
191
258
|
* ```ts
|
|
@@ -199,5 +266,5 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
|
|
|
199
266
|
*/
|
|
200
267
|
declare const _default: (options?: TamaguiPluginOptions | undefined) => import("@razorwind/core/plugin").Plugin;
|
|
201
268
|
//#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 };
|
|
269
|
+
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
270
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -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{
|
|
2
|
-
`,`\\n`).replaceAll(`\r`,`\\r`)}function
|
|
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";import{getUniqueBy as p}from"@stryke/helpers/get-unique";function m(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`).replaceAll(`
|
|
2
|
+
`,`\\n`).replaceAll(`\r`,`\\r`)}function h(e){return typeof e==`string`?`"${m(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function g(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 _=/^(?:font-size|fontSize)(?:\.|$)/i,v=/^(?:font-weight|fontWeight)(?:\.|$)/i,y=/^shadow(?:\.|$)/i,b=/^inset-shadow(?:\.|$)/i,x=/^drop-shadow(?:\.|$)/i,S=/^text-shadow(?:\.|$)/i,C=/^(?:blur|blur-?radius)(?:\.|$)/i,w=new Set([`color`,`shadow`,`insetShadow`,`dropShadow`,`textShadow`]),T=[{prefix:/^(?:color|colours?|palette)(?:\.|$)/i,category:`color`},{prefix:_,category:`fontSize`},{prefix:v,category:`fontWeight`},{prefix:x,category:`dropShadow`},{prefix:b,category:`insetShadow`},{prefix:S,category:`textShadow`},{prefix:y,category:`shadow`},{prefix:C,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 E(e){return`$value`in e||`value`in e||`$ref`in e||`ref`in e}function D(e){return e===!0||e===`true`||e===1}function O(e){return D(e.palette)||D(e.$palette)?!0:te(e)===`palette`}function k(e,t){return(e===`palette`||e===`$palette`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function A(e){return e===!0||e===`true`||e===1}function j(e){return A(e.primitive)||A(e.$primitive)?!0:te(e)===`primitive`}function M(e,t){return(e===`primitive`||e===`$primitive`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function ee(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function te(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function ne(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 re(e,t){for(let{prefix:t,category:n}of T)if(t.test(e))return n;if(t===`color`||t===`palette`)return`color`;if(t===`shadow`)return b.test(e)?`insetShadow`:x.test(e)?`dropShadow`:S.test(e)?`textShadow`:`shadow`;if(t===`dimension`){if(_.test(e))return`fontSize`;if(C.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`||v.test(e))return`fontWeight`}function N(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 ie(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`:N(r)}function ae(e,t,r,a,o,s){if(!i(e))return;let c=o||j(e)||O(e),l=te(e,r);if(E(e)){let r=ne(e),i=t.join(`.`),o=re(i,l)??(c||l===`primitive`||l===`palette`?`color`:void 0),u=n(r,l),d=o&&w.has(o)||l===`color`||l===`palette`||l===`primitive`||l===`shadow`?u:g(r,l);s.push({path:i,type:l===`palette`||l===`primitive`?`color`:l,value:r,cssValue:u,tamaguiValue:d,category:o,tokenKey:o?ie(i):void 0,description:ee(e),theme:a,primitive:c});return}for(let[n,r]of Object.entries(e))n.startsWith(`$`)&&n!==`$palette`&&n!==`$primitive`||k(n,r)||M(n,r)||ae(r,[...t,n],l,a,c,s)}function oe(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;ae(t.tokens,[],void 0,e,!1,r)}return n?r.filter(e=>!e.type||n.has(e.type)):r}const se=/^\{([^{}]+)\}$/,ce=/^(?:typography|type|text)$/i,le=/^(?:font|fonts|font-family|fontFamily)$/i,ue=/^(?:font-size|fontSize)$/i,de=/^(?:font-weight|fontWeight)$/i,fe=/^(?:line-height|lineHeight|leading)$/i,pe=/^(?:letter-spacing|letterSpacing|tracking)$/i,me=/^(?:[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,he=[`fontFamily`,`font-family`,`family`],ge=[`fontSize`,`font-size`,`size`],_e=[`fontWeight`,`font-weight`,`weight`],ve=[`lineHeight`,`line-height`,`leading`],ye=[`letterSpacing`,`letter-spacing`,`tracking`],be={1:12,2:14,3:16,4:18,5:20,6:24,7:28,8:32,9:40,10:48};function P(e){if(typeof e==`string`)return se.exec(e.trim())?.[1]?.trim()}function F(e,t){let n=P(e);if(!n)return e;let r=t.get(n),i=new Set([n]);for(let e=0;e<8&&r;e++){let e=P(r.value);if(!e||i.has(e))return r.value;i.add(e),r=t.get(e)}return r?.value??e}function I(e,t){for(let n of t)if(e[n]!==void 0&&e[n]!==null)return e[n]}function xe(e){return(e.split(`,`)[0]?.trim()??e).replaceAll(/^["']|["']$/g,``)}function Se(e){if(typeof e==`string`){let t=e.trim();return t.length===0||P(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 Ce(e){return Number.isInteger(e)?e:Math.round(e*1e3)/1e3}function L(e){if(e==null)return;let t=g(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 we(e){if(typeof e==`number`&&Number.isFinite(e))return String(e);if(typeof e==`string`){let t=e.trim();if(t.length===0||P(t))return;let n=Number(t);return Number.isNaN(n)?t:String(n)}let t=g(e);if(typeof t==`number`&&Number.isFinite(t))return String(t);if(typeof t==`string`&&t.length>0)return t}function Te(e,t){let n=L(e);if(n!=null)return Ce(t!=null&&n>0&&n<=4?n*t:n)}function R(e,t){return t.test(e.split(`.`)[0]??``)}function Ee(e){return e.split(`.`).filter(Boolean).at(-1)??e}function z(e,t){let n=e.split(`.`).filter(Boolean);return n[0]&&t.test(n[0])&&n.shift(),n}function B(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 V(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 B([e])}}function De(e){return e.role?V(e.role):V(e.name)}function Oe(e){let t=z(e,ce);if(t.length===0)return`body`;let n=t.at(-1);return n&&t.length>=2&&me.test(n)&&!n.includes(`_`)?`${B(t.slice(0,-1))}_${n}`:B(t)}function ke(e){return V(z(e,le)[0]??Ee(e))}function H(e,t){let n=z(e,t);return n.length===0||n.length===1&&/^(?:DEFAULT|default)$/i.test(n[0])?`true`:B(n)}function Ae(e){return e.type===`typography`&&i(e.value)}function je(e){return e.category===`fontSize`||e.category===`fontWeight`||Me(e)||Ne(e)||Pe(e)||Fe(e)?!1:e.type===`fontFamily`||R(e.path,le)}function Me(e){return e.category===`fontSize`||R(e.path,ue)}function Ne(e){return e.category===`fontWeight`||e.type===`fontWeight`||R(e.path,de)}function Pe(e){return R(e.path,fe)}function Fe(e){return R(e.path,pe)}function Ie(e){let t=new Map;for(let n of Object.values(e)){let e=De(n),r=t.get(e);(!r||n.role===e&&r.role!==e)&&t.set(e,n)}return t}function Le(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=xe(t).toLowerCase();return r.find(e=>f(e).toLowerCase()===i||e.title.toLowerCase()===i||e.name.toLowerCase()===i)}function Re(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: ${h(t.normal)}`),t.italic&&n.push(`italic: ${h(t.italic)}`),` ${e}: { ${n.join(`, `)} }`}).join(`,
|
|
3
|
+
`)}\n }`}function U(e,t){return{...e,webFamily:d(t),nativeFamily:f(t),face:t.source===`local`?Re(t):e.face}}function W(e){return{key:e,webFamily:`system-ui, sans-serif`,nativeFamily:`system-ui`,size:{},lineHeight:{},weight:{},letterSpacing:{}}}function ze(e,t){return{...e,webFamily:t,nativeFamily:xe(t)}}function Be(e,t){let n={},r=[],i={},a={};for(let o of e){if(Me(o)){let e=L(F(o.value,t));e!=null&&(n[H(o.path,ue)]=e);continue}if(Ne(o)){let e=we(F(o.value,t));e&&(i[H(o.path,de)]=e);continue}if(Fe(o)){let e=L(F(o.value,t));e!=null&&(a[H(o.path,pe)]=e);continue}Pe(o)&&r.push({key:H(o.path,fe),value:F(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=Te(e.value,t);r!=null&&(s[e.key]=r)}return{size:n,lineHeight:s,weight:i,letterSpacing:a}}function G(e,t){return{...t,...e}}function K(e,t){return{...e,size:G(e.size,t.size),lineHeight:G(e.lineHeight,t.lineHeight),weight:G(e.weight,t.weight),letterSpacing:G(e.letterSpacing,t.letterSpacing)}}function Ve(e){return Object.keys(e.size).length>0?e:{...e,size:{...be}}}function He(e,t,n,r){if(!i(t.value))return e;let a=I(t.value,he),o=P(a),s=Se(F(a,n)),c=Le(r,s,o),l=e;c?l=U(l,c):s&&(l=ze(l,s));let u=L(F(I(t.value,ge),n));u!=null&&(l={...l,size:{...l.size,true:u}});let d=we(F(I(t.value,_e),n));d&&(l={...l,weight:{...l.weight,true:d}});let f=L(F(I(t.value,ye),n));f!=null&&(l={...l,letterSpacing:{...l.letterSpacing,true:f}});let p=Te(F(I(t.value,ve),n),l.size.true??u);return p!=null&&(l={...l,lineHeight:{...l.lineHeight,true:p}}),l}function Ue(e,t){let n=new Map(e.map(e=>[e.path,e])),r=Be(e,n),i=new Map,a=e=>{i.set(e.key,e)};if(t)for(let[e,n]of Ie(t))a(K(U(W(e),n),r));for(let o of e){if(!je(o)||Ae(o))continue;let e=ke(o.path),s=Se(F(o.value,n)),c=i.get(e)??W(e),l=Le(t,s,o.path),u=c;l?u=U(u,l):(s&&c.webFamily===W(e).webFamily||s&&!i.has(e))&&(u=ze(u,s)),a(K(u,r))}for(let o of e){if(!Ae(o))continue;let e=Oe(o.path);a(He(K(i.get(e)??W(e),r),o,n,t))}return p([...i.values()].map(Ve).toSorted((e,t)=>e.key.localeCompare(t.key)),e=>e.key)}function We(e){return/^\d+$/.test(e)||/^[A-Z_$][\w$]*$/i.test(e)?e:h(e)}function q(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}${We(e)}: ${h(t)}`).join(`,
|
|
4
|
+
`)}\n${r}}`}function Ge(e,t){let n=`${e.replaceAll(/\W/g,``)||`font${t}`}Font`;return/^[A-Z_]/i.test(n)?n:`font${t}`}function Ke(e,t){let n=h(e.webFamily),r=h(e.nativeFamily),i=[n===r?` family: ${n}`:` family: isWeb ? ${n} : ${r}`,` size: ${q(e.size)}`];return Object.keys(e.lineHeight).length>0&&i.push(` lineHeight: ${q(e.lineHeight)}`),Object.keys(e.weight).length>0&&i.push(` weight: ${q(e.weight)}`),Object.keys(e.letterSpacing).length>0&&i.push(` letterSpacing: ${q(e.letterSpacing)}`),e.face&&i.push(` face: ${e.face}`),`const ${t} = createFont({\n${i.join(`,
|
|
5
|
+
`)}\n});`}function qe(e){return`# Installing Tamagui Config
|
|
3
6
|
|
|
4
7
|
Generated by \`@razorwind/tamagui\`.
|
|
5
8
|
|
|
@@ -32,32 +35,34 @@ export function App() {
|
|
|
32
35
|
}
|
|
33
36
|
\`\`\`
|
|
34
37
|
|
|
35
|
-
3. Use
|
|
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
|
|
41
|
-
`)}\n${` `.repeat(Math.max(t-2,0))}}`}function
|
|
42
|
-
|
|
43
|
-
|
|
51
|
+
`}const Je=new Set([`default`,`light`,`theme`]),Ye=/^base(?:[A-Z]\w*|[._-].+)?$/i,Xe=[`base`,`gray`,`grey`,`neutral`],Ze={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function Qe(e){return Je.has(e)}function $e(e){return e===`dark`}function J(e,t){let n=new Map,r=t===`dark`?$e:Qe;for(let t of e){let e=t.theme?.toLowerCase();(!e||Ye.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 et=new Set([`fontSize`,`blur`]),tt=[`space`,`size`,`radius`,`zIndex`,`blur`,`fontSize`,`shadow`,`insetShadow`,`dropShadow`,`textShadow`,`boxShadow`,`fontWeight`];function nt(e){return/^px\(-?\d/.test(e)}function rt(e){if(e.category===`radius`&&e.tokenKey?.startsWith(`borderRadius`)){let t=e.tokenKey.replace(/^borderRadius/,``);return t?N([t]):e.tokenKey}return e.tokenKey??``}function it(e){return e.category&&et.has(e.category)&&typeof e.tamaguiValue==`number`?`px(${e.tamaguiValue})`:e.category===`dropShadow`&&typeof e.tamaguiValue==`string`?at(e.tamaguiValue):e.tamaguiValue}function at(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 ot(e){let t={};for(let n of e){if(!n.category||n.category===`color`||!n.tokenKey)continue;let e=rt(n);if(!e)continue;let r=t[n.category]??{};r[e]=it(n),t[n.category]=r}return t}function st(e,t){let n={},r=(e,t)=>{let r=t.cssValue;typeof r!=`string`||r.length===0||ft(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.primitive?r(i(t),t):r(t.tokenKey,t));for(let e of t)!e.tokenKey||!e.primitive||r(i(e),e);return n}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`&&nt(t)?t:h(t);return`${n}${/^[A-Z_$][\w$]*$/i.test(e)?e:h(e)}: ${r}`}).join(`,
|
|
52
|
+
`)}\n${` `.repeat(Math.max(t-2,0))}}`}function ct(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:h(e)}: ${t}`).join(`,
|
|
53
|
+
`)}\n${r}}`}const lt=/^\{([^{}]+)\}$/,ut=/^var\((--[^),\s]+)(?:\s*,[^)]*)?\)$/;function dt(e){if(typeof e==`string`)return lt.exec(e.trim())?.[1]?.trim()}function X(e){if(typeof e==`string`)return ut.exec(e.trim())?.[1]}function ft(e){return dt(e)!=null||X(e)!=null}function pt(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=dt(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 mt(e){return/^[A-Z_$][\w$]*$/i.test(e)?`theme.${e}`:`theme[${h(e)}]`}function ht(e,t,n){let r=_t(e);if(r){if(t&&r.name.toLowerCase()===t.toLowerCase())return`color${r.step}`;if(n[r.name])return`${r.name}${r.step}`}}function gt(e){if(e>=1&&e<=12)return e;if(e>=100&&e<=900&&e%100==0)return e/100}function _t(e){let t=e.path.split(`.`).filter(Boolean),n=t.at(-1);if(n&&/^\d+$/.test(n)){let e=gt(Number(n)),r=t.at(-2);if(e!=null&&r&&!/^(?:color|colours?|palette)$/i.test(r))return{name:N([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=gt(Number(a));if(o!=null)return{name:i,step:o}}function vt(e,t,n,r){let i=e[t]??{};i[`${t}${n}`]=r,e[t]=i}function yt(e){let t={};for(let n of e){if(typeof n.tamaguiValue!=`string`)continue;let e=_t(n);e&&vt(t,e.name,e.step,n.tamaguiValue)}return Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=3))}function Z(e){let t={};for(let n of e){if(!n.primitive||typeof n.tamaguiValue!=`string`)continue;let e=_t(n);e&&vt(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:yt(e)}function bt(e,t){if(e.length<2)return[...e];let n=wt(e[0]),r=wt(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 xt(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 St(e){return e>1?e/100:e}function Ct(e,t){let n=RegExp(`^${t}\\((.+)\\)$`,`i`).exec(e.trim());if(n?.[1])return n[1].split(/[\s,/]+/).filter(Boolean)}function wt(e){let t=e.trim();if(!t||t.startsWith(`var(`)||t.includes(`{`))return;let n=xt(t);if(n!=null)return n;let r=Ct(t,`oklch`);if(r?.[0]){let e=$(r[0]);return e==null?void 0:St(e)}let i=Ct(t,`hsla?`);if(i?.[2]){let e=$(i[2]);return e==null?void 0:St(e)}let a=Ct(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 Tt(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 Et(e,t,n){let r=Tt(e,t);if(r.length===0)return e;let i=bt(r.map(([,e])=>e),n),a={};for(let[e,[n]]of r.entries())a[`${t}${n}`]=i[e]??r[e][1];return a}function Dt(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 Ot(e,t,n){let r=Tt(e,t);if(!(r.length<2))return Dt(bt(r.map(([,e])=>e),n))}function kt(e,t){let n=new Map(Object.entries(e).map(([e,t])=>[e.toLowerCase(),{name:e,scale:t}]));for(let e of Xe){let r=n.get(e);if(!r)continue;let i=Ot(r.scale,r.name,t);if(i)return{name:r.name,palette:i}}}function At(e){let t=e.filter(e=>e.category===`color`||e.primitive),n=Z(J(t,`light`)),r=Z(J(t,`dark`)),i=kt(n,`light`),a=kt(r,`dark`);return{lightPalette:i?.palette,darkPalette:a?.palette,lightBaseName:i?.name,darkBaseName:a?.name}}function jt(e,t){let n=Z(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.primitive||/^[A-Z]+\d{1,3}$/i.test(o.tokenKey)&&n[o.tokenKey.replace(/\d{1,3}$/,``)])continue;let e=pt(o,r,i),s=ht(e,t,n);if(s){a[o.tokenKey]=mt(s);continue}let c=e.tamaguiValue;ft(c)||ft(e.cssValue)||(typeof c==`string`||typeof c==`number`)&&(a[o.tokenKey]=h(c))}return a}function Mt(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=Et(e[i]??t[i]??{},i,`light`),a=Et(t[i]??e[i]??{},i,`dark`);Object.keys(n).length!==0&&Object.keys(a).length!==0&&r.push(` ${i}: {
|
|
54
|
+
light: ${Y(n,8)},
|
|
55
|
+
dark: ${Y(a,8)}
|
|
44
56
|
}`)}if(r.length!==0)return`{\n${r.join(`,
|
|
45
|
-
`)}\n }`}function
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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 Nt(e){let t=new Set;for(let n of e)for(let e of Object.values(n)){for(let n of e.matchAll(/theme\.([A-Z_$][\w$]*)/gi))n[1]&&t.add(n[1]);for(let n of e.matchAll(/theme\[(['"])(.+?)\1\]/g))t.add(n[2])}return[...t]}function Pt(e,t){let n=new Set;for(let r of[e,t])for(let e of Object.values(r))for(let t of Object.keys(e))n.add(t);return[...n]}function Ft(e,t){let n=Math.max(e?.length??0,t?.length??0);if(n===0)return[];let r=[];for(let e=1;e<=Math.min(n,12);e++)r.push(`color${e}`);return r}function It(e){let t=new Set;for(let n of Object.keys(e.lightSemantic))t.add(n);for(let n of Object.keys(e.darkSemantic))t.add(n);for(let n of Nt([e.lightSemantic,e.darkSemantic]))t.add(n);for(let n of Pt(e.lightScales,e.darkScales))t.add(n);for(let n of Ft(e.lightPalette,e.darkPalette))t.add(n);return[...t].toSorted((e,t)=>e.localeCompare(t,void 0,{numeric:!0}))}function Lt(e){return` ${/^[A-Z_$][\w$]*$/i.test(e)?e:h(e)}: string;`}function Rt(e,t){if(e.length!==0)return[`/**`,` * Theme values available on \`useTheme()\` and \`$\` style props for the ${t.specName||`design system`}.`,` *`," * Derived from design tokens mapped by `createV5Theme` and `getTheme`.",` *`,` * @see https://tamagui.dev/docs/guides/theme-builder#gettheme`,` */`,`export interface AppTheme {`,...e.map(Lt),`}`,``]}function zt(e,t,n={}){let r=e.fonts??{},i=n.useDefaultConfig!==!1,a=n.animations??`css`,o=n.includeTypeAugmentation!==!1,s=t.filter(e=>e.category===`color`),c=J(s,`light`),l=J(s,`dark`),u=Z(c),d=Z(l.length>0?l:c),{lightPalette:f,darkPalette:p,lightBaseName:m,darkBaseName:g}=At(t),_=Mt(u,d),v=jt(c,m),y=jt(l.length>0?l:c,l.length>0?g:m),b=Rt(It({lightSemantic:v,darkSemantic:y,lightScales:u,darkScales:d,lightPalette:f,darkPalette:p}),{specName:e.name}),x=b?`AppTheme`:`Record<string, string>`,S=ot(J(t,`light`)),C=st(c,l),w=[];Object.keys(C).length>0&&w.push(` color: ${Y(C,4)}`);for(let e of tt){let t=S[e];t&&Object.keys(t).length>0&&w.push(` ${e}: ${Y(t,4)}`)}let T=[];f&&T.push(` lightPalette: ${h(f)}`),p&&T.push(` darkPalette: ${h(p)}`),_&&T.push(` childrenThemes: ${_}`),(Object.keys(v).length>0||Object.keys(y).length>0)&&T.push(` getTheme: ({ theme, scheme }: { theme: ${x}; scheme: "light" | "dark" }) => {
|
|
58
|
+
return scheme === "dark"
|
|
59
|
+
? ${ct(y,8)}
|
|
60
|
+
: ${ct(v,8)};
|
|
61
|
+
}`);let E=[`import { isWeb } from '@tamagui/constants';`];i?E.push(`import { createV5Theme, defaultConfig, type CreateV5ThemeOptions } from "@tamagui/config/v5";`):E.push(`import { createV5Theme, type CreateV5ThemeOptions } from "@tamagui/config/v5";`),a!==!1&&E.push(`import { animations } from "${Ze[a]}";`);let D=[`createTamagui`,`px`];w.length>0&&D.push(`createTokens`);let O=Ue(J(t,`light`),r);O.length>0&&D.push(`createFont`),E.push(`import { ${D.join(`, `)} } from "@tamagui/core";`);let k=[`/* eslint-disable */`,``,`/*`,` * Generated by @razorwind/tamagui — Do not edit by hand.`,` * `,` * @see https://tamagui.dev/docs/core/config-v5`,` */`,``,...E,``];w.length>0&&k.push(`const tokens = createTokens({`,w.join(`,
|
|
62
|
+
`),`});`,``);let A=T.length>0?`createV5Theme({\n${T.join(`,
|
|
63
|
+
`)}\n})`:`createV5Theme()`;k.push(`const themes = ${A};`,``);let j=new Map;if(O.length>0)for(let[e,t]of O.entries()){let n=Ge(t.key,e);j.set(t.key,n),k.push(Ke(t,n),``)}let M=[];if(i&&M.push(` ...defaultConfig`),a!==!1&&M.push(` animations`),w.length>0&&(i?M.push(` tokens: {
|
|
55
64
|
...defaultConfig.tokens,
|
|
56
65
|
...tokens,
|
|
57
|
-
color: {
|
|
58
|
-
...defaultConfig.tokens.color,
|
|
59
|
-
...tokens.color
|
|
60
|
-
},
|
|
61
66
|
space: {
|
|
62
67
|
...defaultConfig.tokens.space,
|
|
63
68
|
...tokens.space
|
|
@@ -74,14 +79,24 @@ Re-run Razorwind generate when tokens change so \`${e.outputPath}\` stays aligne
|
|
|
74
79
|
...defaultConfig.tokens.zIndex,
|
|
75
80
|
...tokens.zIndex
|
|
76
81
|
}
|
|
77
|
-
}`):
|
|
82
|
+
}`):M.push(` tokens`)),M.push(` themes`),j.size>0){let e=[...j.entries()].map(([e,t])=>` ${/^[A-Z_$][\w$]*$/i.test(e)?e:h(e)}: ${t}`);i?M.push(` fonts: {
|
|
78
83
|
...defaultConfig.fonts,
|
|
79
84
|
${e.join(`,
|
|
80
85
|
`)}
|
|
81
|
-
}`):
|
|
86
|
+
}`):M.push(` fonts: {
|
|
82
87
|
${e.join(`,
|
|
83
88
|
`)}
|
|
84
|
-
}`)}return
|
|
85
|
-
|
|
86
|
-
|
|
89
|
+
}`)}return n.shorthands&&M.push(` shorthands: ${Y(n.shorthands,4)}`),n.media&&M.push(` media: ${h(n.media)}`),M.push(` selectionStyles(theme: ${x}) {
|
|
90
|
+
return {
|
|
91
|
+
backgroundColor: theme.color.background.primary,
|
|
92
|
+
color: theme.color.text.primary
|
|
93
|
+
};
|
|
94
|
+
} `),n.defaultFont&&M.push(` defaultFont: ${h(n.defaultFont)}`),k.push(``,...b??[],`/**
|
|
95
|
+
* The Tamagui v5 config for the ${e.name||`design system`}.
|
|
96
|
+
*
|
|
97
|
+
* @see https://tamagui.dev/docs/core/config-v5
|
|
98
|
+
*/
|
|
99
|
+
export const config = createTamagui({`,M.join(`,
|
|
100
|
+
`),`});`,``,`export type AppConfig = typeof config;`,``),o&&k.push(`declare module "@tamagui/core" {`,` // eslint-disable-next-line @typescript-eslint/no-empty-object-type`,` interface TamaguiCustomConfig extends AppConfig {}`,`}`,``),k.push(`export default config;`,``),k.join(`
|
|
101
|
+
`)}function Bt(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?oe(e.tokens,n):[];if(a.length===0&&!i)return{};let o=n.outputPath??`tamagui.config.ts`,s=zt(e,a,n),c=n.installGuide??qe({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 Vt=e(e=>({name:`tamagui`,themeGeneration:`combined`,generate:async t=>Bt(t,e??{})}));export{Z as collectColorScales,Ue as collectTamaguiFonts,wt as colorLightness,Vt as default,oe as flattenTokens,Ge as fontVarName,n as formatTokenValue,Bt as generateTamaguiConfig,O as isPaletteGroup,bt as orderPaletteForScheme,qe as renderInstallMd,zt as renderTamaguiConfig,re as resolveTokenCategory,a as resolveTokenSets,V as tamaguiFontKeyFromRole,N as toCamelCaseKey,o as toCssVar,g as toTamaguiValue,ie as toTokenKey,Oe as typographyFontKey};
|
|
87
102
|
//# 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.42",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Razorwind plugin that creates Tamagui theme tokens from Razorwind design tokens.",
|
|
6
6
|
"repository": {
|
|
@@ -85,8 +85,10 @@
|
|
|
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.
|
|
89
|
-
"@stryke/type-checks": "^0.6.41"
|
|
88
|
+
"@razorwind/core": "^0.0.53",
|
|
89
|
+
"@stryke/type-checks": "^0.6.41",
|
|
90
|
+
"@stryke/helpers": "^0.10.48",
|
|
91
|
+
"@stryke/string-format": "^0.17.50"
|
|
90
92
|
},
|
|
91
93
|
"peerDependencies": {
|
|
92
94
|
"@tamagui/config": ">=1.120.0",
|
|
@@ -104,5 +106,5 @@
|
|
|
104
106
|
"typescript": "^6.0.3"
|
|
105
107
|
},
|
|
106
108
|
"publishConfig": { "access": "public" },
|
|
107
|
-
"gitHead": "
|
|
109
|
+
"gitHead": "715b431b64aad787ba61ad7ed70c8633869460f0"
|
|
108
110
|
}
|