@razorwind/tamagui 0.0.37 → 0.0.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,11 +1,11 @@
1
1
  Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});let e=require("@razorwind/core/plugin"),t=require("@razorwind/core/lib/fonts"),n=require("@razorwind/core/utils"),r=require("node:path");function i(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`).replaceAll(`
2
- `,`\\n`).replaceAll(`\r`,`\\r`)}function a(e){return typeof e==`string`?`"${i(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function o(e,t){if(typeof e==`number`)return e;if(typeof e==`boolean`)return Number(e);if((0,n.isObject)(e)&&typeof e.value==`number`&&typeof e.unit==`string`){let t=e.unit.toLowerCase();return t===`px`||t===``?e.value:t===`rem`?e.value*16:`${e.value}${e.unit}`}if(typeof e==`string`){let t=/^(-?\d+(?:\.\d+)?)px$/i.exec(e.trim());if(t)return Number(t[1]);let n=/^(-?\d+(?:\.\d+)?)rem$/i.exec(e.trim());if(n)return Number(n[1])*16;let r=Number(e);return!Number.isNaN(r)&&e.trim()!==``?r:e}return String(e)}const s=[{prefix:/^(?:color|colours?|palette)\b/i,category:`color`},{prefix:/^(?:space|spacing|gap|inset)\b/i,category:`space`},{prefix:/^(?:size|sizing)\b/i,category:`size`},{prefix:/^(?:radius|rounded|radii)\b/i,category:`radius`},{prefix:/^(?:z-?index|zindex|elevation)\b/i,category:`zIndex`}];function c(e){return`$value`in e||`value`in e||`$ref`in e||`ref`in e}function l(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function u(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function d(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 f(e,t){for(let{prefix:t,category:n}of s)if(t.test(e))return n;if(t===`color`)return`color`;if(t===`dimension`){if(/space|spacing|gap|inset/i.test(e))return`space`;if(/radius|rounded/i.test(e))return`radius`;if(/z-?index|elevation/i.test(e))return`zIndex`;if(/size|sizing|width|height/i.test(e))return`size`}if(t===`number`&&/z-?index|elevation/i.test(e))return`zIndex`}function p(e){let t=e.split(`.`).filter(Boolean),n=t[0];n&&/^(?:color|colours?|palette|space|spacing|gap|inset|size|sizing|radius|rounded|radii|z-?index|zindex|elevation)$/i.test(n)&&t.shift();let r=t.join(``)||e.split(`.`).at(-1)||e;return/^(?:DEFAULT|default)$/i.test(r)?`true`:r}function m(e,t,r,i,a){if(!(0,n.isObject)(e))return;let s=u(e,r);if(c(e)){let r=d(e),c=t.join(`.`),u=f(c,s),m=(0,n.formatTokenValue)(r,s),h=u===`color`||s===`color`?m:o(r,s);a.push({path:c,type:s,value:r,cssValue:m,tamaguiValue:h,category:u,tokenKey:u?p(c):void 0,description:l(e),theme:i});return}for(let[n,r]of Object.entries(e))n.startsWith(`$`)||m(r,[...t,n],s,i,a)}function h(e,t={}){let r=t.includeTypes?new Set(t.includeTypes):void 0,i=[];for(let t of(0,n.resolveTokenSets)(e)){let e=t.id==="default"?void 0:t.id;m(t.tokens,[],void 0,e,i)}return r?i.filter(e=>!e.type||r.has(e.type)):i}function g(e){return`# Installing Tamagui Config
2
+ `,`\\n`).replaceAll(`\r`,`\\r`)}function a(e){return typeof e==`string`?`"${i(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function o(e,t){if(typeof e==`number`)return e;if(typeof e==`boolean`)return Number(e);if((0,n.isObject)(e)&&typeof e.value==`number`&&typeof e.unit==`string`){let t=e.unit.toLowerCase();return t===`px`||t===``?e.value:t===`rem`?e.value*16:`${e.value}${e.unit}`}if(typeof e==`string`){let t=/^(-?\d+(?:\.\d+)?)px$/i.exec(e.trim());if(t)return Number(t[1]);let n=/^(-?\d+(?:\.\d+)?)rem$/i.exec(e.trim());if(n)return Number(n[1])*16;let r=Number(e);return!Number.isNaN(r)&&e.trim()!==``?r:e}return String(e)}const s=[{prefix:/^(?:color|colours?|palette)\b/i,category:`color`},{prefix:/^(?:space|spacing|gap|inset)\b/i,category:`space`},{prefix:/^(?:size|sizing)\b/i,category:`size`},{prefix:/^(?:radius|rounded|radii)\b/i,category:`radius`},{prefix:/^(?:z-?index|zindex|elevation)\b/i,category:`zIndex`}];function c(e){return`$value`in e||`value`in e||`$ref`in e||`ref`in e}function l(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function u(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function d(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 f(e,t){for(let{prefix:t,category:n}of s)if(t.test(e))return n;if(t===`color`)return`color`;if(t===`dimension`){if(/space|spacing|gap|inset/i.test(e))return`space`;if(/radius|rounded/i.test(e))return`radius`;if(/z-?index|elevation/i.test(e))return`zIndex`;if(/size|sizing|width|height/i.test(e))return`size`}if(t===`number`&&/z-?index|elevation/i.test(e))return`zIndex`}function p(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 m(e){let t=e.split(`.`).filter(Boolean),n=t[0];n&&/^(?:color|colours?|palette|space|spacing|gap|inset|size|sizing|radius|rounded|radii|z-?index|zindex|elevation)$/i.test(n)&&t.shift();let r=t.length>0?t:e.split(`.`).slice(-1);return r.length===1&&/^(?:DEFAULT|default)$/i.test(r[0]??``)?`true`:p(r)}function h(e,t,r,i,a){if(!(0,n.isObject)(e))return;let s=u(e,r);if(c(e)){let r=d(e),c=t.join(`.`),u=f(c,s),p=(0,n.formatTokenValue)(r,s),h=u===`color`||s===`color`?p:o(r,s);a.push({path:c,type:s,value:r,cssValue:p,tamaguiValue:h,category:u,tokenKey:u?m(c):void 0,description:l(e),theme:i});return}for(let[n,r]of Object.entries(e))n.startsWith(`$`)||h(r,[...t,n],s,i,a)}function g(e,t={}){let r=t.includeTypes?new Set(t.includeTypes):void 0,i=[];for(let t of(0,n.resolveTokenSets)(e)){let e=t.id==="default"?void 0:t.id;h(t.tokens,[],void 0,e,i)}return r?i.filter(e=>!e.type||r.has(e.type)):i}function _(e){return`# Installing Tamagui Config
3
3
 
4
4
  Generated by \`@razorwind/tamagui\`.
5
5
 
6
6
  ## Files
7
7
 
8
- - \`${e.outputPath}\` — Tamagui v5 config (\`createTamagui\` + generated tokens/themes)
8
+ - \`${e.outputPath}\` — Tamagui v5 config (\`createTamagui\` + \`createV5Theme\` with light and dark)
9
9
 
10
10
  ## Setup
11
11
 
@@ -17,7 +17,7 @@ import config from "./${e.outputPath}";
17
17
  export default config;
18
18
  \`\`\`
19
19
 
20
- 2. Wrap your app with Tamagui (example):
20
+ 2. Wrap your app with Tamagui. The generated file includes both \`light\` and \`dark\` themes:
21
21
 
22
22
  \`\`\`tsx
23
23
  import { TamaguiProvider } from "tamagui";
@@ -37,21 +37,21 @@ export function App() {
37
37
  ## Regenerate
38
38
 
39
39
  Re-run Razorwind generate when tokens change so \`${e.outputPath}\` stays aligned with your design system.
40
- `}const _=new Set([`default`,`base`,`light`,`theme`]),v=new Set([`gray`,`grey`,`neutral`,`slate`,`zinc`,`stone`,`palette`,`base`]),y={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function b(e){let t=new Set(e.map(e=>e.theme).filter(e=>!!e));if(t.size===0)return e;for(let t of _){let n=e.filter(e=>e.theme?.toLowerCase()===t);if(n.length>0)return n}let n=[...t][0];return e.filter(e=>e.theme===n)}function x(e,t){return e.filter(e=>e.theme?.toLowerCase()===t)}function S(e){let t={};for(let n of e){if(!n.category||!n.tokenKey)continue;let e=t[n.category]??{};e[n.tokenKey]=n.tamaguiValue,t[n.category]=e}return t}function C(e,t=2){let n=` `.repeat(t),r=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));return r.length===0?`{}`:`{\n${r.map(([e,t])=>{let r=/^[A-Z_$][\w$]*$/i.test(e)?e:a(e);return`${n}${r}: ${a(t)}`}).join(`,
41
- `)}\n${` `.repeat(Math.max(t-2,0))}}`}function w(e){let t={},n=new Map;for(let t of e)!t.tokenKey||typeof t.tamaguiValue!=`string`||n.set(t.tokenKey,t.tamaguiValue);let r=/^([A-Z]+)(\d{1,2})$/i;for(let[e,i]of n){let n=r.exec(e);if(!n)continue;let[,a=``,o=``]=n,s=Number(o);if(s<0||s>12)continue;let c=t[a]??{};c[`${a}${s}`]=i,t[a]=c}return Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=3))}function T(e,t){let n=[];for(let r=1;r<=12;r++){let i=e[`${t}${r}`];if(!i)return;n.push(i)}return n}function E(e){let t=b(e.filter(e=>e.category===`color`)),n=x(e.filter(e=>e.category===`color`),`dark`),r=w(t),i=w(n),a,o;for(let e of Object.keys(r))if(v.has(e.toLowerCase())&&(a=T(r[e],e),a))break;for(let e of Object.keys(i))if(v.has(e.toLowerCase())&&(o=T(i[e],e),o))break;return{lightPalette:a,darkPalette:o}}function D(e){let t=w(e),n={};for(let r of e)r.category!==`color`||!r.tokenKey||typeof r.tamaguiValue!=`string`||/^[A-Z]+\d{1,2}$/i.test(r.tokenKey)&&t[r.tokenKey.replace(/\d{1,2}$/,``)]||(n[r.tokenKey]=r.tamaguiValue);return n}function O(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))){if(v.has(i.toLowerCase()))continue;let n=e[i]??t[i],a=t[i]??e[i];!n||!a||r.push(` ${i}: {
42
- light: ${C(n,8)},
43
- dark: ${C(a,8)}
40
+ `}const v=new Set([`default`,`light`,`theme`]),y=/^base(?:[A-Z]\w*|[._-].+)?$/i,b=new Set([`gray`,`grey`,`neutral`,`slate`,`zinc`,`stone`,`palette`,`base`]),x={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function S(e){return v.has(e)}function C(e){return e===`dark`}function w(e,t){let n=new Map,r=t===`dark`?C:S;for(let t of e){let e=t.theme?.toLowerCase();(!e||y.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 T(e){let t={};for(let n of e){if(!n.category||!n.tokenKey)continue;let e=t[n.category]??{};e[n.tokenKey]=n.tamaguiValue,t[n.category]=e}return t}function E(e,t=2){let n=` `.repeat(t),r=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));return r.length===0?`{}`:`{\n${r.map(([e,t])=>{let r=/^[A-Z_$][\w$]*$/i.test(e)?e:a(e);return`${n}${r}: ${a(t)}`}).join(`,
41
+ `)}\n${` `.repeat(Math.max(t-2,0))}}`}function D(e){let t={},n=new Map;for(let t of e)!t.tokenKey||typeof t.tamaguiValue!=`string`||n.set(t.tokenKey,t.tamaguiValue);let r=/^([A-Z]+)(\d{1,2})$/i;for(let[e,i]of n){let n=r.exec(e);if(!n)continue;let[,a=``,o=``]=n,s=Number(o);if(s<0||s>12)continue;let c=t[a]??{};c[`${a}${s}`]=i,t[a]=c}return Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=3))}function O(e,t){let n=[];for(let r=1;r<=12;r++){let i=e[`${t}${r}`];if(!i)return;n.push(i)}return n}function k(e){let t=e.filter(e=>e.category===`color`),n=D(w(t,`light`)),r=D(w(t,`dark`)),i,a;for(let e of Object.keys(n))if(b.has(e.toLowerCase())&&(i=O(n[e],e),i))break;for(let e of Object.keys(r))if(b.has(e.toLowerCase())&&(a=O(r[e],e),a))break;return{lightPalette:i,darkPalette:a}}function A(e){let t=D(e),n={};for(let r of e)r.category!==`color`||!r.tokenKey||typeof r.tamaguiValue!=`string`||/^[A-Z]+\d{1,2}$/i.test(r.tokenKey)&&t[r.tokenKey.replace(/\d{1,2}$/,``)]||(n[r.tokenKey]=r.tamaguiValue);return n}function j(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))){if(b.has(i.toLowerCase()))continue;let n=e[i]??t[i],a=t[i]??e[i];!n||!a||r.push(` ${i}: {
42
+ light: ${E(n,8)},
43
+ dark: ${E(a,8)}
44
44
  }`)}if(r.length!==0)return`{\n${r.join(`,
45
- `)}\n }`}function k(e){switch(e.role){case`heading`:case`display`:return`heading`;case`mono`:case`code`:return`mono`;case`sans`:case`body`:case`serif`:return`body`;case void 0:default:return e.name?.replaceAll(/\W/g,``)||`body`}}function A(e){let t=new Map;for(let n of Object.values(e)){let e=k(n),r=t.get(e);(!r||n.role===e&&r.role!==e)&&t.set(e,n)}return t}function j(e){let t=new Map;for(let n of e.files){let e=String(n.weight??400),i=(0,r.basename)(n.path).replace(/\.[^.]+$/,``),a=t.get(e)??{};n.style===`italic`||n.style===`oblique`?a.italic=i:a.normal=i,t.set(e,a)}if(t.size!==0)return`{\n${[...t.entries()].toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0})).map(([e,t])=>{let n=[];return t.normal&&n.push(`normal: ${a(t.normal)}`),t.italic&&n.push(`italic: ${a(t.italic)}`),` ${e}: { ${n.join(`, `)} }`}).join(`,
46
- `)}\n }`}function M(e,n){let r=e.source===`local`?j(e):void 0,i=[`const ${n} = createFont({`,` family: isWeb ? ${a((0,t.cssFontFamily)(e))} : ${a((0,t.fontFamilyName)(e))},`,` size: {`,` 1: 12,`,` 2: 14,`,` 3: 16,`,` 4: 18,`,` 5: 20,`,` 6: 24,`,` 7: 28,`,` 8: 32,`,` 9: 40,`,` 10: 48`,` }${r?`,`:``}`];return r&&i.push(` face: ${r}`),i.push(`});`),i.join(`
47
- `)}function N(e,t={},n){let r=t.useDefaultConfig!==!1,i=t.animations??`css`,o=t.includeTypeAugmentation!==!1,s=S(b(e)),c=b(e.filter(e=>e.category===`color`)),l=x(e.filter(e=>e.category===`color`),`dark`),u=w(c),d=w(l.length>0?l:c),{lightPalette:f,darkPalette:p}=E(e),m=O(u,d),h=D(c),g=D(l.length>0?l:c),_=Object.keys(h).length>0||Object.keys(g).length>0,v=[];for(let e of[`color`,`space`,`size`,`radius`,`zIndex`]){let t=s[e];t&&Object.keys(t).length>0&&v.push(` ${e}: ${C(t,4)}`)}let T=[];f&&T.push(` lightPalette: ${a(f)}`),p&&T.push(` darkPalette: ${a(p)}`),m&&T.push(` childrenThemes: ${m}`),_&&T.push(` getTheme: ({ scheme }) => {
45
+ `)}\n }`}function M(e){switch(e.role){case`heading`:case`display`:return`heading`;case`mono`:case`code`:return`mono`;case`sans`:case`body`:case`serif`:return`body`;case void 0:default:return e.name?.replaceAll(/\W/g,``)||`body`}}function N(e){let t=new Map;for(let n of Object.values(e)){let e=M(n),r=t.get(e);(!r||n.role===e&&r.role!==e)&&t.set(e,n)}return t}function P(e){let t=new Map;for(let n of e.files){let e=String(n.weight??400),i=(0,r.basename)(n.path).replace(/\.[^.]+$/,``),a=t.get(e)??{};n.style===`italic`||n.style===`oblique`?a.italic=i:a.normal=i,t.set(e,a)}if(t.size!==0)return`{\n${[...t.entries()].toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0})).map(([e,t])=>{let n=[];return t.normal&&n.push(`normal: ${a(t.normal)}`),t.italic&&n.push(`italic: ${a(t.italic)}`),` ${e}: { ${n.join(`, `)} }`}).join(`,
46
+ `)}\n }`}function F(e,n){let r=e.source===`local`?P(e):void 0,i=[`const ${n} = createFont({`,` family: isWeb ? ${a((0,t.cssFontFamily)(e))} : ${a((0,t.fontFamilyName)(e))},`,` size: {`,` 1: 12,`,` 2: 14,`,` 3: 16,`,` 4: 18,`,` 5: 20,`,` 6: 24,`,` 7: 28,`,` 8: 32,`,` 9: 40,`,` 10: 48`,` }${r?`,`:``}`];return r&&i.push(` face: ${r}`),i.push(`});`),i.join(`
47
+ `)}function I(e,t={},n){let r=t.useDefaultConfig!==!1,i=t.animations??`css`,o=t.includeTypeAugmentation!==!1,s=T(w(e,`light`)),c=e.filter(e=>e.category===`color`),l=w(c,`light`),u=w(c,`dark`),d=D(l),f=D(u.length>0?u:l),{lightPalette:p,darkPalette:m}=k(e),h=j(d,f),g=A(l),_=A(u.length>0?u:l),v=Object.keys(g).length>0||Object.keys(_).length>0,y=[];for(let e of[`color`,`space`,`size`,`radius`,`zIndex`]){let t=s[e];t&&Object.keys(t).length>0&&y.push(` ${e}: ${E(t,4)}`)}let b=[];p&&b.push(` lightPalette: ${a(p)}`),m&&b.push(` darkPalette: ${a(m)}`),h&&b.push(` childrenThemes: ${h}`),v&&b.push(` getTheme: ({ scheme }) => {
48
48
  const semantic = scheme === "dark"
49
- ? ${C(g,8)}
50
- : ${C(h,8)};
49
+ ? ${E(_,8)}
50
+ : ${E(g,8)};
51
51
  return semantic;
52
- }`);let k=[];r?k.push(`import { createV5Theme, defaultConfig } from "@tamagui/config/v5";`):k.push(`import { createV5Theme } from "@tamagui/config/v5";`),i!==!1&&k.push(`import { animations } from "${y[i]}";`);let j=[`createTamagui`];v.length>0&&j.push(`createTokens`);let N=n?A(n):new Map;N.size>0&&j.push(`createFont`,`isWeb`),k.push(`import { ${j.join(`, `)} } from "tamagui";`);let P=[`/* eslint-disable */`,`/*`,` * Generated by @razorwind/tamagui — do not edit by hand.`,` * @see https://tamagui.dev/docs/core/config-v5`,` */`,``,...k,``];v.length>0&&P.push(`const tokens = createTokens({`,v.join(`,
53
- `),`});`,``);let F=T.length>0?`createV5Theme({\n${T.join(`,
54
- `)}\n})`:`createV5Theme()`;P.push(`const themes = ${F};`,``);let I=new Map;if(N.size>0){let e=0;for(let[t,n]of N){let r=`${t}Font`.replaceAll(/\W/g,``)||`font${e}`;I.set(t,r),P.push(M(n,r),``),e+=1}}let L=[];if(r&&L.push(` ...defaultConfig`),i!==!1&&L.push(` animations`),v.length>0&&(r?L.push(` tokens: {
52
+ }`);let S=[];r?S.push(`import { createV5Theme, defaultConfig } from "@tamagui/config/v5";`):S.push(`import { createV5Theme } from "@tamagui/config/v5";`),i!==!1&&S.push(`import { animations } from "${x[i]}";`);let C=[`createTamagui`];y.length>0&&C.push(`createTokens`);let O=n?N(n):new Map;O.size>0&&C.push(`createFont`,`isWeb`),S.push(`import { ${C.join(`, `)} } from "tamagui";`);let M=[`/* eslint-disable */`,`/*`,` * Generated by @razorwind/tamagui — do not edit by hand.`,` * @see https://tamagui.dev/docs/core/config-v5`,` */`,``,...S,``];y.length>0&&M.push(`const tokens = createTokens({`,y.join(`,
53
+ `),`});`,``);let P=b.length>0?`createV5Theme({\n${b.join(`,
54
+ `)}\n})`:`createV5Theme()`;M.push(`const themes = ${P};`,``);let I=new Map;if(O.size>0){let e=0;for(let[t,n]of O){let r=`${t}Font`.replaceAll(/\W/g,``)||`font${e}`;I.set(t,r),M.push(F(n,r),``),e+=1}}let L=[];if(r&&L.push(` ...defaultConfig`),i!==!1&&L.push(` animations`),y.length>0&&(r?L.push(` tokens: {
55
55
  ...defaultConfig.tokens,
56
56
  ...tokens,
57
57
  color: {
@@ -81,6 +81,6 @@ ${e.join(`,
81
81
  }`):L.push(` fonts: {
82
82
  ${e.join(`,
83
83
  `)}
84
- }`)}return P.push(`export const config = createTamagui({`,L.join(`,
85
- `),`});`,``,`export type AppConfig = typeof config;`,``),o&&P.push(`declare module "tamagui" {`,` // eslint-disable-next-line @typescript-eslint/no-empty-object-type`,` interface TamaguiCustomConfig extends AppConfig {}`,`}`,``),P.push(`export default config;`,``),P.join(`
86
- `)}function P(e,t={}){let i=e.tokens&&Object.keys(e.tokens).length>0,a=e.fonts&&Object.keys(e.fonts).length>0;if(!i&&!a)return{};let o=i?h(e.tokens,t):[];if(o.length===0&&!a)return{};let s=t.outputPath??`tamagui.config.ts`,c=N(o,t,e.fonts),l=t.installGuide??g({outputPath:s}),u=(0,r.join)((0,r.dirname)(s),`INSTALL.md`);return{[s]:(0,n.createDocument)(s,c,{name:`razorwind-tamagui`},void 0,`typescript`),[u]:(0,n.createDocument)(u,l,{name:`razorwind-tamagui`},void 0,`markdown`)}}var F=(0,e.definePlugin)(e=>({name:`tamagui`,generate:async t=>P(t,e??{})}));exports.collectColorScales=w,exports.default=F,exports.flattenTokens=h,Object.defineProperty(exports,"formatTokenValue",{enumerable:!0,get:function(){return n.formatTokenValue}}),exports.generateTamaguiConfig=P,exports.renderInstallMd=g,exports.renderTamaguiConfig=N,exports.resolveTokenCategory=f,exports.resolveTokenSets=n.resolveTokenSets,Object.defineProperty(exports,"toCssVar",{enumerable:!0,get:function(){return n.toCssVar}}),exports.toTamaguiValue=o,exports.toTokenKey=p;
84
+ }`)}return M.push(`export const config = createTamagui({`,L.join(`,
85
+ `),`});`,``,`export type AppConfig = typeof config;`,``),o&&M.push(`declare module "tamagui" {`,` // eslint-disable-next-line @typescript-eslint/no-empty-object-type`,` interface TamaguiCustomConfig extends AppConfig {}`,`}`,``),M.push(`export default config;`,``),M.join(`
86
+ `)}function L(e,t={}){let i=e.tokens&&Object.keys(e.tokens).length>0,a=e.fonts&&Object.keys(e.fonts).length>0;if(!i&&!a)return{};let o=i?g(e.tokens,t):[];if(o.length===0&&!a)return{};let s=t.outputPath??`tamagui.config.ts`,c=I(o,t,e.fonts),l=t.installGuide??_({outputPath:s}),u=(0,r.join)((0,r.dirname)(s),`INSTALL.md`);return{[s]:(0,n.createDocument)(s,c,{name:`razorwind-tamagui`},!1,`typescript`),[u]:(0,n.createDocument)(u,l,{name:`razorwind-tamagui`},!1,`markdown`)}}var R=(0,e.definePlugin)(e=>({name:`tamagui`,themeGeneration:`combined`,generate:async t=>L(t,e??{})}));exports.collectColorScales=D,exports.default=R,exports.flattenTokens=g,Object.defineProperty(exports,"formatTokenValue",{enumerable:!0,get:function(){return n.formatTokenValue}}),exports.generateTamaguiConfig=L,exports.renderInstallMd=_,exports.renderTamaguiConfig=I,exports.resolveTokenCategory=f,exports.resolveTokenSets=n.resolveTokenSets,exports.toCamelCaseKey=p,Object.defineProperty(exports,"toCssVar",{enumerable:!0,get:function(){return n.toCssVar}}),exports.toTamaguiValue=o,exports.toTokenKey=m;
package/dist/index.d.cts CHANGED
@@ -20,6 +20,9 @@ interface TamaguiPluginOptions {
20
20
  /**
21
21
  * Output path written relative to the execution cwd.
22
22
  *
23
+ * Light and dark schemes are always written to this single file — Tamagui
24
+ * `createV5Theme` encodes both palettes in one config.
25
+ *
23
26
  * @defaultValue `"tamagui.config.ts"`
24
27
  */
25
28
  outputPath?: string;
@@ -85,11 +88,19 @@ interface FlatToken {
85
88
  * Map a DTCG token path + type onto a Tamagui `createTokens` category.
86
89
  */
87
90
  declare function resolveTokenCategory(path: string, type?: string): TamaguiTokenCategory | undefined;
91
+ /**
92
+ * Join path/kebab segments into a camelCase Tamagui token key.
93
+ *
94
+ * `background` + `accent-subtle` → `backgroundAccentSubtle`.
95
+ * Numeric steps stay attached (`blue` + `1` → `blue1`).
96
+ */
97
+ declare function toCamelCaseKey(parts: string[]): string;
88
98
  /**
89
99
  * Derive the Tamagui token key from a DTCG path (strip category prefix).
90
100
  *
91
101
  * `radius.DEFAULT` → `true` (Tamagui default token convention).
92
102
  * `color.blue.1` → `blue1`.
103
+ * `color.background.accent-subtle` → `backgroundAccentSubtle`.
93
104
  */
94
105
  declare function toTokenKey(path: string): string;
95
106
  /**
@@ -126,6 +137,8 @@ declare function collectColorScales(colorTokens: FlatToken[]): Record<string, Re
126
137
  /**
127
138
  * Render a Tamagui v5 config module from flattened design tokens.
128
139
  *
140
+ * Light and dark token sets are combined into one `createV5Theme` call.
141
+ *
129
142
  * @see https://tamagui.dev/docs/core/config-v5
130
143
  */
131
144
  declare function renderTamaguiConfig(tokens: FlatToken[], options?: TamaguiPluginOptions, fonts?: Fonts): string;
@@ -139,6 +152,10 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
139
152
  * Razorwind plugin that turns design tokens into a Tamagui v5 config
140
153
  * (`createTamagui` + `createTokens` + `createV5Theme`).
141
154
  *
155
+ * Light and dark token sets are emitted as a single config: `createV5Theme`
156
+ * receives both `lightPalette` / `darkPalette` and `childrenThemes` with
157
+ * `{ light, dark }` palettes.
158
+ *
142
159
  * @see https://tamagui.dev/docs/core/config-v5
143
160
  *
144
161
  * @example
@@ -153,5 +170,5 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
153
170
  */
154
171
  declare const _default: (options?: TamaguiPluginOptions | undefined) => import("@razorwind/core/plugin").Plugin;
155
172
  //#endregion
156
- export { type FlatToken, type TamaguiAnimationDriver, type TamaguiPluginOptions, type TamaguiTokenCategory, collectColorScales, _default as default, flattenTokens, formatTokenValue, generateTamaguiConfig, renderInstallMd, renderTamaguiConfig, resolveTokenCategory, resolveTokenSets, toCssVar, toTamaguiValue, toTokenKey };
173
+ export { type FlatToken, type TamaguiAnimationDriver, type TamaguiPluginOptions, type TamaguiTokenCategory, collectColorScales, _default as default, flattenTokens, formatTokenValue, generateTamaguiConfig, renderInstallMd, renderTamaguiConfig, resolveTokenCategory, resolveTokenSets, toCamelCaseKey, toCssVar, toTamaguiValue, toTokenKey };
157
174
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/flatten.ts","../src/format.ts","../src/install.ts","../src/generate.ts","../src/index.ts"],"mappings":";;;;;;;;;;KAyBY;;;;KAMA;;;;UAMK;;;;;;EAMf;;;;;;;EAQA,aAAa;;;;;;;;EASb;;;;;EAMA,eAAe;;;;;;;EAQf;;;;;EAMA;;;;;UAMe;;EAEf;;EAEA,OAAO;;EAEP;;EAEA;;EAEA;;EAEA,WAAW;;EAEX;;EAEA;;EAEA;;;;;;;iBCfc,qBACd,cACA,gBACC;;;;;;;iBAuCa,WAAW;;;;iBAuEX,cACd,QAAQ,SAAS,eAAe,SAChC,UAAS,KAAK,wCACb;;;;;;;;;iBCnJa,eAAe,gBAAgB;;;;;;;;iBCnC/B,gBAAgB;EAAW;;;;;;;;;iBCwG3B,mBACd,aAAa,cACZ,eAAe;;;;;;iBAkQF,oBACd,QAAQ,aACR,UAAS,sBACT,QAAQ;;;;iBA2NM,sBACd,MAAM,QACN,UAAS,uBACR,wBAAwB,QAAQ"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/flatten.ts","../src/format.ts","../src/install.ts","../src/generate.ts","../src/index.ts"],"mappings":";;;;;;;;;;KAyBY;;;;KAMA;;;;UAMK;;;;;;;;;EASf;;;;;;;EAQA,aAAa;;;;;;;;EASb;;;;;EAMA,eAAe;;;;;;;EAQf;;;;;EAMA;;;;;UAMe;;EAEf;;EAEA,OAAO;;EAEP;;EAEA;;EAEA;;EAEA,WAAW;;EAEX;;EAEA;;EAEA;;;;;;;iBCjBc,qBACd,cACA,gBACC;;;;;;;iBAuCa,eAAe;;;;;;;;iBA0Bf,WAAW;;;;iBA0EX,cACd,QAAQ,SAAS,eAAe,SAChC,UAAS,KAAK,wCACb;;;;;;;;;iBCjLa,eAAe,gBAAgB;;;;;;;;iBCnC/B,gBAAgB;EAAW;;;;;;;;;iBCwH3B,mBACd,aAAa,cACZ,eAAe;;;;;;;;iBA2PF,oBACd,QAAQ,aACR,UAAS,sBACT,QAAQ;;;;iBAuNM,sBACd,MAAM,QACN,UAAS,uBACR,wBAAwB,QAAQ"}
package/dist/index.d.mts CHANGED
@@ -20,6 +20,9 @@ interface TamaguiPluginOptions {
20
20
  /**
21
21
  * Output path written relative to the execution cwd.
22
22
  *
23
+ * Light and dark schemes are always written to this single file — Tamagui
24
+ * `createV5Theme` encodes both palettes in one config.
25
+ *
23
26
  * @defaultValue `"tamagui.config.ts"`
24
27
  */
25
28
  outputPath?: string;
@@ -85,11 +88,19 @@ interface FlatToken {
85
88
  * Map a DTCG token path + type onto a Tamagui `createTokens` category.
86
89
  */
87
90
  declare function resolveTokenCategory(path: string, type?: string): TamaguiTokenCategory | undefined;
91
+ /**
92
+ * Join path/kebab segments into a camelCase Tamagui token key.
93
+ *
94
+ * `background` + `accent-subtle` → `backgroundAccentSubtle`.
95
+ * Numeric steps stay attached (`blue` + `1` → `blue1`).
96
+ */
97
+ declare function toCamelCaseKey(parts: string[]): string;
88
98
  /**
89
99
  * Derive the Tamagui token key from a DTCG path (strip category prefix).
90
100
  *
91
101
  * `radius.DEFAULT` → `true` (Tamagui default token convention).
92
102
  * `color.blue.1` → `blue1`.
103
+ * `color.background.accent-subtle` → `backgroundAccentSubtle`.
93
104
  */
94
105
  declare function toTokenKey(path: string): string;
95
106
  /**
@@ -126,6 +137,8 @@ declare function collectColorScales(colorTokens: FlatToken[]): Record<string, Re
126
137
  /**
127
138
  * Render a Tamagui v5 config module from flattened design tokens.
128
139
  *
140
+ * Light and dark token sets are combined into one `createV5Theme` call.
141
+ *
129
142
  * @see https://tamagui.dev/docs/core/config-v5
130
143
  */
131
144
  declare function renderTamaguiConfig(tokens: FlatToken[], options?: TamaguiPluginOptions, fonts?: Fonts): string;
@@ -139,6 +152,10 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
139
152
  * Razorwind plugin that turns design tokens into a Tamagui v5 config
140
153
  * (`createTamagui` + `createTokens` + `createV5Theme`).
141
154
  *
155
+ * Light and dark token sets are emitted as a single config: `createV5Theme`
156
+ * receives both `lightPalette` / `darkPalette` and `childrenThemes` with
157
+ * `{ light, dark }` palettes.
158
+ *
142
159
  * @see https://tamagui.dev/docs/core/config-v5
143
160
  *
144
161
  * @example
@@ -153,5 +170,5 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
153
170
  */
154
171
  declare const _default: (options?: TamaguiPluginOptions | undefined) => import("@razorwind/core/plugin").Plugin;
155
172
  //#endregion
156
- export { type FlatToken, type TamaguiAnimationDriver, type TamaguiPluginOptions, type TamaguiTokenCategory, collectColorScales, _default as default, flattenTokens, formatTokenValue, generateTamaguiConfig, renderInstallMd, renderTamaguiConfig, resolveTokenCategory, resolveTokenSets, toCssVar, toTamaguiValue, toTokenKey };
173
+ export { type FlatToken, type TamaguiAnimationDriver, type TamaguiPluginOptions, type TamaguiTokenCategory, collectColorScales, _default as default, flattenTokens, formatTokenValue, generateTamaguiConfig, renderInstallMd, renderTamaguiConfig, resolveTokenCategory, resolveTokenSets, toCamelCaseKey, toCssVar, toTamaguiValue, toTokenKey };
157
174
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -1,11 +1,11 @@
1
1
  import{definePlugin as e}from"@razorwind/core/plugin";import{cssFontFamily as t,fontFamilyName as n}from"@razorwind/core/lib/fonts";import{createDocument as r,formatTokenValue as i,isObject as a,resolveTokenSets as o,toCssVar as s}from"@razorwind/core/utils";import{basename as c,dirname as l,join as u}from"node:path";function d(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`).replaceAll(`
2
- `,`\\n`).replaceAll(`\r`,`\\r`)}function f(e){return typeof e==`string`?`"${d(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function p(e,t){if(typeof e==`number`)return e;if(typeof e==`boolean`)return Number(e);if(a(e)&&typeof e.value==`number`&&typeof e.unit==`string`){let t=e.unit.toLowerCase();return t===`px`||t===``?e.value:t===`rem`?e.value*16:`${e.value}${e.unit}`}if(typeof e==`string`){let t=/^(-?\d+(?:\.\d+)?)px$/i.exec(e.trim());if(t)return Number(t[1]);let n=/^(-?\d+(?:\.\d+)?)rem$/i.exec(e.trim());if(n)return Number(n[1])*16;let r=Number(e);return!Number.isNaN(r)&&e.trim()!==``?r:e}return String(e)}const m=[{prefix:/^(?:color|colours?|palette)\b/i,category:`color`},{prefix:/^(?:space|spacing|gap|inset)\b/i,category:`space`},{prefix:/^(?:size|sizing)\b/i,category:`size`},{prefix:/^(?:radius|rounded|radii)\b/i,category:`radius`},{prefix:/^(?:z-?index|zindex|elevation)\b/i,category:`zIndex`}];function h(e){return`$value`in e||`value`in e||`$ref`in e||`ref`in e}function g(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function _(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function v(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 y(e,t){for(let{prefix:t,category:n}of m)if(t.test(e))return n;if(t===`color`)return`color`;if(t===`dimension`){if(/space|spacing|gap|inset/i.test(e))return`space`;if(/radius|rounded/i.test(e))return`radius`;if(/z-?index|elevation/i.test(e))return`zIndex`;if(/size|sizing|width|height/i.test(e))return`size`}if(t===`number`&&/z-?index|elevation/i.test(e))return`zIndex`}function b(e){let t=e.split(`.`).filter(Boolean),n=t[0];n&&/^(?:color|colours?|palette|space|spacing|gap|inset|size|sizing|radius|rounded|radii|z-?index|zindex|elevation)$/i.test(n)&&t.shift();let r=t.join(``)||e.split(`.`).at(-1)||e;return/^(?:DEFAULT|default)$/i.test(r)?`true`:r}function x(e,t,n,r,o){if(!a(e))return;let s=_(e,n);if(h(e)){let n=v(e),a=t.join(`.`),c=y(a,s),l=i(n,s),u=c===`color`||s===`color`?l:p(n,s);o.push({path:a,type:s,value:n,cssValue:l,tamaguiValue:u,category:c,tokenKey:c?b(a):void 0,description:g(e),theme:r});return}for(let[n,i]of Object.entries(e))n.startsWith(`$`)||x(i,[...t,n],s,r,o)}function S(e,t={}){let n=t.includeTypes?new Set(t.includeTypes):void 0,r=[];for(let t of o(e)){let e=t.id==="default"?void 0:t.id;x(t.tokens,[],void 0,e,r)}return n?r.filter(e=>!e.type||n.has(e.type)):r}function C(e){return`# Installing Tamagui Config
2
+ `,`\\n`).replaceAll(`\r`,`\\r`)}function f(e){return typeof e==`string`?`"${d(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function p(e,t){if(typeof e==`number`)return e;if(typeof e==`boolean`)return Number(e);if(a(e)&&typeof e.value==`number`&&typeof e.unit==`string`){let t=e.unit.toLowerCase();return t===`px`||t===``?e.value:t===`rem`?e.value*16:`${e.value}${e.unit}`}if(typeof e==`string`){let t=/^(-?\d+(?:\.\d+)?)px$/i.exec(e.trim());if(t)return Number(t[1]);let n=/^(-?\d+(?:\.\d+)?)rem$/i.exec(e.trim());if(n)return Number(n[1])*16;let r=Number(e);return!Number.isNaN(r)&&e.trim()!==``?r:e}return String(e)}const m=[{prefix:/^(?:color|colours?|palette)\b/i,category:`color`},{prefix:/^(?:space|spacing|gap|inset)\b/i,category:`space`},{prefix:/^(?:size|sizing)\b/i,category:`size`},{prefix:/^(?:radius|rounded|radii)\b/i,category:`radius`},{prefix:/^(?:z-?index|zindex|elevation)\b/i,category:`zIndex`}];function h(e){return`$value`in e||`value`in e||`$ref`in e||`ref`in e}function g(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function _(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function v(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 y(e,t){for(let{prefix:t,category:n}of m)if(t.test(e))return n;if(t===`color`)return`color`;if(t===`dimension`){if(/space|spacing|gap|inset/i.test(e))return`space`;if(/radius|rounded/i.test(e))return`radius`;if(/z-?index|elevation/i.test(e))return`zIndex`;if(/size|sizing|width|height/i.test(e))return`size`}if(t===`number`&&/z-?index|elevation/i.test(e))return`zIndex`}function b(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 x(e){let t=e.split(`.`).filter(Boolean),n=t[0];n&&/^(?:color|colours?|palette|space|spacing|gap|inset|size|sizing|radius|rounded|radii|z-?index|zindex|elevation)$/i.test(n)&&t.shift();let r=t.length>0?t:e.split(`.`).slice(-1);return r.length===1&&/^(?:DEFAULT|default)$/i.test(r[0]??``)?`true`:b(r)}function S(e,t,n,r,o){if(!a(e))return;let s=_(e,n);if(h(e)){let n=v(e),a=t.join(`.`),c=y(a,s),l=i(n,s),u=c===`color`||s===`color`?l:p(n,s);o.push({path:a,type:s,value:n,cssValue:l,tamaguiValue:u,category:c,tokenKey:c?x(a):void 0,description:g(e),theme:r});return}for(let[n,i]of Object.entries(e))n.startsWith(`$`)||S(i,[...t,n],s,r,o)}function C(e,t={}){let n=t.includeTypes?new Set(t.includeTypes):void 0,r=[];for(let t of o(e)){let e=t.id==="default"?void 0:t.id;S(t.tokens,[],void 0,e,r)}return n?r.filter(e=>!e.type||n.has(e.type)):r}function w(e){return`# Installing Tamagui Config
3
3
 
4
4
  Generated by \`@razorwind/tamagui\`.
5
5
 
6
6
  ## Files
7
7
 
8
- - \`${e.outputPath}\` — Tamagui v5 config (\`createTamagui\` + generated tokens/themes)
8
+ - \`${e.outputPath}\` — Tamagui v5 config (\`createTamagui\` + \`createV5Theme\` with light and dark)
9
9
 
10
10
  ## Setup
11
11
 
@@ -17,7 +17,7 @@ import config from "./${e.outputPath}";
17
17
  export default config;
18
18
  \`\`\`
19
19
 
20
- 2. Wrap your app with Tamagui (example):
20
+ 2. Wrap your app with Tamagui. The generated file includes both \`light\` and \`dark\` themes:
21
21
 
22
22
  \`\`\`tsx
23
23
  import { TamaguiProvider } from "tamagui";
@@ -37,21 +37,21 @@ export function App() {
37
37
  ## Regenerate
38
38
 
39
39
  Re-run Razorwind generate when tokens change so \`${e.outputPath}\` stays aligned with your design system.
40
- `}const w=new Set([`default`,`base`,`light`,`theme`]),T=new Set([`gray`,`grey`,`neutral`,`slate`,`zinc`,`stone`,`palette`,`base`]),E={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function D(e){let t=new Set(e.map(e=>e.theme).filter(e=>!!e));if(t.size===0)return e;for(let t of w){let n=e.filter(e=>e.theme?.toLowerCase()===t);if(n.length>0)return n}let n=[...t][0];return e.filter(e=>e.theme===n)}function O(e,t){return e.filter(e=>e.theme?.toLowerCase()===t)}function k(e){let t={};for(let n of e){if(!n.category||!n.tokenKey)continue;let e=t[n.category]??{};e[n.tokenKey]=n.tamaguiValue,t[n.category]=e}return t}function A(e,t=2){let n=` `.repeat(t),r=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));return r.length===0?`{}`:`{\n${r.map(([e,t])=>{let r=/^[A-Z_$][\w$]*$/i.test(e)?e:f(e);return`${n}${r}: ${f(t)}`}).join(`,
41
- `)}\n${` `.repeat(Math.max(t-2,0))}}`}function j(e){let t={},n=new Map;for(let t of e)!t.tokenKey||typeof t.tamaguiValue!=`string`||n.set(t.tokenKey,t.tamaguiValue);let r=/^([A-Z]+)(\d{1,2})$/i;for(let[e,i]of n){let n=r.exec(e);if(!n)continue;let[,a=``,o=``]=n,s=Number(o);if(s<0||s>12)continue;let c=t[a]??{};c[`${a}${s}`]=i,t[a]=c}return Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=3))}function M(e,t){let n=[];for(let r=1;r<=12;r++){let i=e[`${t}${r}`];if(!i)return;n.push(i)}return n}function N(e){let t=D(e.filter(e=>e.category===`color`)),n=O(e.filter(e=>e.category===`color`),`dark`),r=j(t),i=j(n),a,o;for(let e of Object.keys(r))if(T.has(e.toLowerCase())&&(a=M(r[e],e),a))break;for(let e of Object.keys(i))if(T.has(e.toLowerCase())&&(o=M(i[e],e),o))break;return{lightPalette:a,darkPalette:o}}function P(e){let t=j(e),n={};for(let r of e)r.category!==`color`||!r.tokenKey||typeof r.tamaguiValue!=`string`||/^[A-Z]+\d{1,2}$/i.test(r.tokenKey)&&t[r.tokenKey.replace(/\d{1,2}$/,``)]||(n[r.tokenKey]=r.tamaguiValue);return n}function F(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))){if(T.has(i.toLowerCase()))continue;let n=e[i]??t[i],a=t[i]??e[i];!n||!a||r.push(` ${i}: {
42
- light: ${A(n,8)},
43
- dark: ${A(a,8)}
40
+ `}const T=new Set([`default`,`light`,`theme`]),E=/^base(?:[A-Z]\w*|[._-].+)?$/i,D=new Set([`gray`,`grey`,`neutral`,`slate`,`zinc`,`stone`,`palette`,`base`]),O={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function k(e){return T.has(e)}function A(e){return e===`dark`}function j(e,t){let n=new Map,r=t===`dark`?A:k;for(let t of e){let e=t.theme?.toLowerCase();(!e||E.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 M(e){let t={};for(let n of e){if(!n.category||!n.tokenKey)continue;let e=t[n.category]??{};e[n.tokenKey]=n.tamaguiValue,t[n.category]=e}return t}function N(e,t=2){let n=` `.repeat(t),r=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));return r.length===0?`{}`:`{\n${r.map(([e,t])=>{let r=/^[A-Z_$][\w$]*$/i.test(e)?e:f(e);return`${n}${r}: ${f(t)}`}).join(`,
41
+ `)}\n${` `.repeat(Math.max(t-2,0))}}`}function P(e){let t={},n=new Map;for(let t of e)!t.tokenKey||typeof t.tamaguiValue!=`string`||n.set(t.tokenKey,t.tamaguiValue);let r=/^([A-Z]+)(\d{1,2})$/i;for(let[e,i]of n){let n=r.exec(e);if(!n)continue;let[,a=``,o=``]=n,s=Number(o);if(s<0||s>12)continue;let c=t[a]??{};c[`${a}${s}`]=i,t[a]=c}return Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=3))}function F(e,t){let n=[];for(let r=1;r<=12;r++){let i=e[`${t}${r}`];if(!i)return;n.push(i)}return n}function I(e){let t=e.filter(e=>e.category===`color`),n=P(j(t,`light`)),r=P(j(t,`dark`)),i,a;for(let e of Object.keys(n))if(D.has(e.toLowerCase())&&(i=F(n[e],e),i))break;for(let e of Object.keys(r))if(D.has(e.toLowerCase())&&(a=F(r[e],e),a))break;return{lightPalette:i,darkPalette:a}}function L(e){let t=P(e),n={};for(let r of e)r.category!==`color`||!r.tokenKey||typeof r.tamaguiValue!=`string`||/^[A-Z]+\d{1,2}$/i.test(r.tokenKey)&&t[r.tokenKey.replace(/\d{1,2}$/,``)]||(n[r.tokenKey]=r.tamaguiValue);return n}function R(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))){if(D.has(i.toLowerCase()))continue;let n=e[i]??t[i],a=t[i]??e[i];!n||!a||r.push(` ${i}: {
42
+ light: ${N(n,8)},
43
+ dark: ${N(a,8)}
44
44
  }`)}if(r.length!==0)return`{\n${r.join(`,
45
- `)}\n }`}function I(e){switch(e.role){case`heading`:case`display`:return`heading`;case`mono`:case`code`:return`mono`;case`sans`:case`body`:case`serif`:return`body`;case void 0:default:return e.name?.replaceAll(/\W/g,``)||`body`}}function L(e){let t=new Map;for(let n of Object.values(e)){let e=I(n),r=t.get(e);(!r||n.role===e&&r.role!==e)&&t.set(e,n)}return t}function R(e){let t=new Map;for(let n of e.files){let e=String(n.weight??400),r=c(n.path).replace(/\.[^.]+$/,``),i=t.get(e)??{};n.style===`italic`||n.style===`oblique`?i.italic=r:i.normal=r,t.set(e,i)}if(t.size!==0)return`{\n${[...t.entries()].toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0})).map(([e,t])=>{let n=[];return t.normal&&n.push(`normal: ${f(t.normal)}`),t.italic&&n.push(`italic: ${f(t.italic)}`),` ${e}: { ${n.join(`, `)} }`}).join(`,
46
- `)}\n }`}function z(e,r){let i=e.source===`local`?R(e):void 0,a=[`const ${r} = createFont({`,` family: isWeb ? ${f(t(e))} : ${f(n(e))},`,` size: {`,` 1: 12,`,` 2: 14,`,` 3: 16,`,` 4: 18,`,` 5: 20,`,` 6: 24,`,` 7: 28,`,` 8: 32,`,` 9: 40,`,` 10: 48`,` }${i?`,`:``}`];return i&&a.push(` face: ${i}`),a.push(`});`),a.join(`
47
- `)}function B(e,t={},n){let r=t.useDefaultConfig!==!1,i=t.animations??`css`,a=t.includeTypeAugmentation!==!1,o=k(D(e)),s=D(e.filter(e=>e.category===`color`)),c=O(e.filter(e=>e.category===`color`),`dark`),l=j(s),u=j(c.length>0?c:s),{lightPalette:d,darkPalette:p}=N(e),m=F(l,u),h=P(s),g=P(c.length>0?c:s),_=Object.keys(h).length>0||Object.keys(g).length>0,v=[];for(let e of[`color`,`space`,`size`,`radius`,`zIndex`]){let t=o[e];t&&Object.keys(t).length>0&&v.push(` ${e}: ${A(t,4)}`)}let y=[];d&&y.push(` lightPalette: ${f(d)}`),p&&y.push(` darkPalette: ${f(p)}`),m&&y.push(` childrenThemes: ${m}`),_&&y.push(` getTheme: ({ scheme }) => {
45
+ `)}\n }`}function z(e){switch(e.role){case`heading`:case`display`:return`heading`;case`mono`:case`code`:return`mono`;case`sans`:case`body`:case`serif`:return`body`;case void 0:default:return e.name?.replaceAll(/\W/g,``)||`body`}}function B(e){let t=new Map;for(let n of Object.values(e)){let e=z(n),r=t.get(e);(!r||n.role===e&&r.role!==e)&&t.set(e,n)}return t}function V(e){let t=new Map;for(let n of e.files){let e=String(n.weight??400),r=c(n.path).replace(/\.[^.]+$/,``),i=t.get(e)??{};n.style===`italic`||n.style===`oblique`?i.italic=r:i.normal=r,t.set(e,i)}if(t.size!==0)return`{\n${[...t.entries()].toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0})).map(([e,t])=>{let n=[];return t.normal&&n.push(`normal: ${f(t.normal)}`),t.italic&&n.push(`italic: ${f(t.italic)}`),` ${e}: { ${n.join(`, `)} }`}).join(`,
46
+ `)}\n }`}function H(e,r){let i=e.source===`local`?V(e):void 0,a=[`const ${r} = createFont({`,` family: isWeb ? ${f(t(e))} : ${f(n(e))},`,` size: {`,` 1: 12,`,` 2: 14,`,` 3: 16,`,` 4: 18,`,` 5: 20,`,` 6: 24,`,` 7: 28,`,` 8: 32,`,` 9: 40,`,` 10: 48`,` }${i?`,`:``}`];return i&&a.push(` face: ${i}`),a.push(`});`),a.join(`
47
+ `)}function U(e,t={},n){let r=t.useDefaultConfig!==!1,i=t.animations??`css`,a=t.includeTypeAugmentation!==!1,o=M(j(e,`light`)),s=e.filter(e=>e.category===`color`),c=j(s,`light`),l=j(s,`dark`),u=P(c),d=P(l.length>0?l:c),{lightPalette:p,darkPalette:m}=I(e),h=R(u,d),g=L(c),_=L(l.length>0?l:c),v=Object.keys(g).length>0||Object.keys(_).length>0,y=[];for(let e of[`color`,`space`,`size`,`radius`,`zIndex`]){let t=o[e];t&&Object.keys(t).length>0&&y.push(` ${e}: ${N(t,4)}`)}let b=[];p&&b.push(` lightPalette: ${f(p)}`),m&&b.push(` darkPalette: ${f(m)}`),h&&b.push(` childrenThemes: ${h}`),v&&b.push(` getTheme: ({ scheme }) => {
48
48
  const semantic = scheme === "dark"
49
- ? ${A(g,8)}
50
- : ${A(h,8)};
49
+ ? ${N(_,8)}
50
+ : ${N(g,8)};
51
51
  return semantic;
52
- }`);let b=[];r?b.push(`import { createV5Theme, defaultConfig } from "@tamagui/config/v5";`):b.push(`import { createV5Theme } from "@tamagui/config/v5";`),i!==!1&&b.push(`import { animations } from "${E[i]}";`);let x=[`createTamagui`];v.length>0&&x.push(`createTokens`);let S=n?L(n):new Map;S.size>0&&x.push(`createFont`,`isWeb`),b.push(`import { ${x.join(`, `)} } from "tamagui";`);let C=[`/* eslint-disable */`,`/*`,` * Generated by @razorwind/tamagui — do not edit by hand.`,` * @see https://tamagui.dev/docs/core/config-v5`,` */`,``,...b,``];v.length>0&&C.push(`const tokens = createTokens({`,v.join(`,
53
- `),`});`,``);let w=y.length>0?`createV5Theme({\n${y.join(`,
54
- `)}\n})`:`createV5Theme()`;C.push(`const themes = ${w};`,``);let T=new Map;if(S.size>0){let e=0;for(let[t,n]of S){let r=`${t}Font`.replaceAll(/\W/g,``)||`font${e}`;T.set(t,r),C.push(z(n,r),``),e+=1}}let M=[];if(r&&M.push(` ...defaultConfig`),i!==!1&&M.push(` animations`),v.length>0&&(r?M.push(` tokens: {
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 "${O[i]}";`);let S=[`createTamagui`];y.length>0&&S.push(`createTokens`);let C=n?B(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(H(n,r),``),e+=1}}let D=[];if(r&&D.push(` ...defaultConfig`),i!==!1&&D.push(` animations`),y.length>0&&(r?D.push(` tokens: {
55
55
  ...defaultConfig.tokens,
56
56
  ...tokens,
57
57
  color: {
@@ -74,14 +74,14 @@ Re-run Razorwind generate when tokens change so \`${e.outputPath}\` stays aligne
74
74
  ...defaultConfig.tokens.zIndex,
75
75
  ...tokens.zIndex
76
76
  }
77
- }`):M.push(` tokens`)),M.push(` themes`),T.size>0){let e=[...T.entries()].map(([e,t])=>` ${e}: ${t}`);r?M.push(` fonts: {
77
+ }`):D.push(` tokens`)),D.push(` themes`),E.size>0){let e=[...E.entries()].map(([e,t])=>` ${e}: ${t}`);r?D.push(` fonts: {
78
78
  ...defaultConfig.fonts,
79
79
  ${e.join(`,
80
80
  `)}
81
- }`):M.push(` fonts: {
81
+ }`):D.push(` fonts: {
82
82
  ${e.join(`,
83
83
  `)}
84
- }`)}return C.push(`export const config = createTamagui({`,M.join(`,
85
- `),`});`,``,`export type AppConfig = typeof config;`,``),a&&C.push(`declare module "tamagui" {`,` // eslint-disable-next-line @typescript-eslint/no-empty-object-type`,` interface TamaguiCustomConfig extends AppConfig {}`,`}`,``),C.push(`export default config;`,``),C.join(`
86
- `)}function V(e,t={}){let n=e.tokens&&Object.keys(e.tokens).length>0,i=e.fonts&&Object.keys(e.fonts).length>0;if(!n&&!i)return{};let a=n?S(e.tokens,t):[];if(a.length===0&&!i)return{};let o=t.outputPath??`tamagui.config.ts`,s=B(a,t,e.fonts),c=t.installGuide??C({outputPath:o}),d=u(l(o),`INSTALL.md`);return{[o]:r(o,s,{name:`razorwind-tamagui`},void 0,`typescript`),[d]:r(d,c,{name:`razorwind-tamagui`},void 0,`markdown`)}}var H=e(e=>({name:`tamagui`,generate:async t=>V(t,e??{})}));export{j as collectColorScales,H as default,S as flattenTokens,i as formatTokenValue,V as generateTamaguiConfig,C as renderInstallMd,B as renderTamaguiConfig,y as resolveTokenCategory,o as resolveTokenSets,s as toCssVar,p as toTamaguiValue,b as toTokenKey};
84
+ }`)}return w.push(`export const config = createTamagui({`,D.join(`,
85
+ `),`});`,``,`export type AppConfig = typeof config;`,``),a&&w.push(`declare module "tamagui" {`,` // eslint-disable-next-line @typescript-eslint/no-empty-object-type`,` interface TamaguiCustomConfig extends AppConfig {}`,`}`,``),w.push(`export default config;`,``),w.join(`
86
+ `)}function W(e,t={}){let n=e.tokens&&Object.keys(e.tokens).length>0,i=e.fonts&&Object.keys(e.fonts).length>0;if(!n&&!i)return{};let a=n?C(e.tokens,t):[];if(a.length===0&&!i)return{};let o=t.outputPath??`tamagui.config.ts`,s=U(a,t,e.fonts),c=t.installGuide??w({outputPath:o}),d=u(l(o),`INSTALL.md`);return{[o]:r(o,s,{name:`razorwind-tamagui`},!1,`typescript`),[d]:r(d,c,{name:`razorwind-tamagui`},!1,`markdown`)}}var G=e(e=>({name:`tamagui`,themeGeneration:`combined`,generate:async t=>W(t,e??{})}));export{P as collectColorScales,G as default,C as flattenTokens,i as formatTokenValue,W as generateTamaguiConfig,w as renderInstallMd,U as renderTamaguiConfig,y as resolveTokenCategory,o as resolveTokenSets,b as toCamelCaseKey,s as toCssVar,p as toTamaguiValue,x as toTokenKey};
87
87
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@razorwind/tamagui",
3
- "version": "0.0.37",
3
+ "version": "0.0.39",
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.90",
87
87
  "@power-plant/dtcg-schema": "^0.0.1",
88
- "@razorwind/core": "^0.0.49",
88
+ "@razorwind/core": "^0.0.51",
89
89
  "@stryke/type-checks": "^0.6.41"
90
90
  },
91
91
  "peerDependencies": {
@@ -104,5 +104,5 @@
104
104
  "typescript": "^6.0.3"
105
105
  },
106
106
  "publishConfig": { "access": "public" },
107
- "gitHead": "8dc94fb22937f30d41e97f3c6ecff7f45eb81202"
107
+ "gitHead": "3a51456206724861cda83c344cb35ffcb8b3b8f1"
108
108
  }