@razorwind/tamagui 0.0.34 → 0.0.36
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 +28 -19
- package/dist/index.d.cts +4 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.mjs +28 -19
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
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/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
|
|
3
3
|
|
|
4
4
|
Generated by \`@razorwind/tamagui\`.
|
|
5
5
|
|
|
6
6
|
## Files
|
|
7
7
|
|
|
8
|
-
- \`${e.
|
|
8
|
+
- \`${e.outputPath}\` — Tamagui v5 config (\`createTamagui\` + generated tokens/themes)
|
|
9
9
|
|
|
10
10
|
## Setup
|
|
11
11
|
|
|
12
12
|
1. Point Tamagui at the generated config:
|
|
13
13
|
|
|
14
14
|
\`\`\`ts
|
|
15
|
-
import config from "./${e.
|
|
15
|
+
import config from "./${e.outputPath}";
|
|
16
16
|
|
|
17
17
|
export default config;
|
|
18
18
|
\`\`\`
|
|
@@ -21,7 +21,7 @@ export default config;
|
|
|
21
21
|
|
|
22
22
|
\`\`\`tsx
|
|
23
23
|
import { TamaguiProvider } from "tamagui";
|
|
24
|
-
import config from "./${e.
|
|
24
|
+
import config from "./${e.outputPath}";
|
|
25
25
|
|
|
26
26
|
export function App() {
|
|
27
27
|
return (
|
|
@@ -36,20 +36,22 @@ export function App() {
|
|
|
36
36
|
|
|
37
37
|
## Regenerate
|
|
38
38
|
|
|
39
|
-
Re-run Razorwind generate when tokens change so \`${e.
|
|
40
|
-
`}const
|
|
41
|
-
`)}\n${` `.repeat(Math.max(t-2,0))}}`}function
|
|
42
|
-
light: ${
|
|
43
|
-
dark: ${
|
|
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)}
|
|
44
44
|
}`)}if(r.length!==0)return`{\n${r.join(`,
|
|
45
|
-
`)}\n }`}function
|
|
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 }) => {
|
|
46
48
|
const semantic = scheme === "dark"
|
|
47
|
-
? ${
|
|
48
|
-
: ${
|
|
49
|
+
? ${C(g,8)}
|
|
50
|
+
: ${C(h,8)};
|
|
49
51
|
return semantic;
|
|
50
|
-
}`);let
|
|
51
|
-
`),`});`,``);let
|
|
52
|
-
`)}\n})`:`createV5Theme()`;
|
|
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: {
|
|
53
55
|
...defaultConfig.tokens,
|
|
54
56
|
...tokens,
|
|
55
57
|
color: {
|
|
@@ -72,6 +74,13 @@ Re-run Razorwind generate when tokens change so \`${e.outFile}\` stays aligned w
|
|
|
72
74
|
...defaultConfig.tokens.zIndex,
|
|
73
75
|
...tokens.zIndex
|
|
74
76
|
}
|
|
75
|
-
}`):
|
|
76
|
-
|
|
77
|
-
|
|
77
|
+
}`):L.push(` tokens`)),L.push(` themes`),I.size>0){let e=[...I.entries()].map(([e,t])=>` ${e}: ${t}`);r?L.push(` fonts: {
|
|
78
|
+
...defaultConfig.fonts,
|
|
79
|
+
${e.join(`,
|
|
80
|
+
`)}
|
|
81
|
+
}`):L.push(` fonts: {
|
|
82
|
+
${e.join(`,
|
|
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`},`typescript`),[u]:(0,n.createDocument)(u,l,{name:`razorwind-tamagui`},`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;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TokenType } from "@power-plant/dtcg-schema";
|
|
2
|
-
import { Schema, Tokens } from "@razorwind/core/schema";
|
|
2
|
+
import { Fonts, Schema, Tokens } from "@razorwind/core/schema";
|
|
3
3
|
import { formatTokenValue, resolveTokenSets, toCssVar } from "@razorwind/core/utils";
|
|
4
4
|
import { GeneratorFunctionResult } from "@power-plant/core";
|
|
5
5
|
//#region src/types.d.ts
|
|
@@ -22,7 +22,7 @@ interface TamaguiPluginOptions {
|
|
|
22
22
|
*
|
|
23
23
|
* @defaultValue `"tamagui.config.ts"`
|
|
24
24
|
*/
|
|
25
|
-
|
|
25
|
+
outputPath?: string;
|
|
26
26
|
/**
|
|
27
27
|
* Animation driver import from `@tamagui/config/v5-*`.
|
|
28
28
|
* Set to `false` to omit animations (v5 base config includes none).
|
|
@@ -113,7 +113,7 @@ declare function toTamaguiValue(value: unknown, type?: string): string | number;
|
|
|
113
113
|
* @see https://tamagui.dev/docs/core/config-v5
|
|
114
114
|
*/
|
|
115
115
|
declare function renderInstallMd(options: {
|
|
116
|
-
|
|
116
|
+
outputPath: string;
|
|
117
117
|
}): string;
|
|
118
118
|
//#endregion
|
|
119
119
|
//#region src/generate.d.ts
|
|
@@ -128,7 +128,7 @@ declare function collectColorScales(colorTokens: FlatToken[]): Record<string, Re
|
|
|
128
128
|
*
|
|
129
129
|
* @see https://tamagui.dev/docs/core/config-v5
|
|
130
130
|
*/
|
|
131
|
-
declare function renderTamaguiConfig(tokens: FlatToken[], options?: TamaguiPluginOptions): string;
|
|
131
|
+
declare function renderTamaguiConfig(tokens: FlatToken[], options?: TamaguiPluginOptions, fonts?: Fonts): string;
|
|
132
132
|
/**
|
|
133
133
|
* Generate a Tamagui v5 config file from a Razorwind schema.
|
|
134
134
|
*/
|
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":";;;;;;;;;;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;;;;;;;;;
|
|
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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { formatTokenValue, resolveTokenSets, toCssVar } from "@razorwind/core/utils";
|
|
2
2
|
import { TokenType } from "@power-plant/dtcg-schema";
|
|
3
|
-
import { Schema, Tokens } from "@razorwind/core/schema";
|
|
3
|
+
import { Fonts, Schema, Tokens } from "@razorwind/core/schema";
|
|
4
4
|
import { GeneratorFunctionResult } from "@power-plant/core";
|
|
5
5
|
//#region src/types.d.ts
|
|
6
6
|
/**
|
|
@@ -22,7 +22,7 @@ interface TamaguiPluginOptions {
|
|
|
22
22
|
*
|
|
23
23
|
* @defaultValue `"tamagui.config.ts"`
|
|
24
24
|
*/
|
|
25
|
-
|
|
25
|
+
outputPath?: string;
|
|
26
26
|
/**
|
|
27
27
|
* Animation driver import from `@tamagui/config/v5-*`.
|
|
28
28
|
* Set to `false` to omit animations (v5 base config includes none).
|
|
@@ -113,7 +113,7 @@ declare function toTamaguiValue(value: unknown, type?: string): string | number;
|
|
|
113
113
|
* @see https://tamagui.dev/docs/core/config-v5
|
|
114
114
|
*/
|
|
115
115
|
declare function renderInstallMd(options: {
|
|
116
|
-
|
|
116
|
+
outputPath: string;
|
|
117
117
|
}): string;
|
|
118
118
|
//#endregion
|
|
119
119
|
//#region src/generate.d.ts
|
|
@@ -128,7 +128,7 @@ declare function collectColorScales(colorTokens: FlatToken[]): Record<string, Re
|
|
|
128
128
|
*
|
|
129
129
|
* @see https://tamagui.dev/docs/core/config-v5
|
|
130
130
|
*/
|
|
131
|
-
declare function renderTamaguiConfig(tokens: FlatToken[], options?: TamaguiPluginOptions): string;
|
|
131
|
+
declare function renderTamaguiConfig(tokens: FlatToken[], options?: TamaguiPluginOptions, fonts?: Fonts): string;
|
|
132
132
|
/**
|
|
133
133
|
* Generate a Tamagui v5 config file from a Razorwind schema.
|
|
134
134
|
*/
|
package/dist/index.mjs
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
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{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
|
|
3
3
|
|
|
4
4
|
Generated by \`@razorwind/tamagui\`.
|
|
5
5
|
|
|
6
6
|
## Files
|
|
7
7
|
|
|
8
|
-
- \`${e.
|
|
8
|
+
- \`${e.outputPath}\` — Tamagui v5 config (\`createTamagui\` + generated tokens/themes)
|
|
9
9
|
|
|
10
10
|
## Setup
|
|
11
11
|
|
|
12
12
|
1. Point Tamagui at the generated config:
|
|
13
13
|
|
|
14
14
|
\`\`\`ts
|
|
15
|
-
import config from "./${e.
|
|
15
|
+
import config from "./${e.outputPath}";
|
|
16
16
|
|
|
17
17
|
export default config;
|
|
18
18
|
\`\`\`
|
|
@@ -21,7 +21,7 @@ export default config;
|
|
|
21
21
|
|
|
22
22
|
\`\`\`tsx
|
|
23
23
|
import { TamaguiProvider } from "tamagui";
|
|
24
|
-
import config from "./${e.
|
|
24
|
+
import config from "./${e.outputPath}";
|
|
25
25
|
|
|
26
26
|
export function App() {
|
|
27
27
|
return (
|
|
@@ -36,20 +36,22 @@ export function App() {
|
|
|
36
36
|
|
|
37
37
|
## Regenerate
|
|
38
38
|
|
|
39
|
-
Re-run Razorwind generate when tokens change so \`${e.
|
|
40
|
-
`}const
|
|
41
|
-
`)}\n${` `.repeat(Math.max(t-2,0))}}`}function
|
|
42
|
-
light: ${
|
|
43
|
-
dark: ${
|
|
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)}
|
|
44
44
|
}`)}if(r.length!==0)return`{\n${r.join(`,
|
|
45
|
-
`)}\n }`}function
|
|
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 }) => {
|
|
46
48
|
const semantic = scheme === "dark"
|
|
47
|
-
? ${
|
|
48
|
-
: ${
|
|
49
|
+
? ${A(g,8)}
|
|
50
|
+
: ${A(h,8)};
|
|
49
51
|
return semantic;
|
|
50
|
-
}`);let
|
|
51
|
-
`),`});`,``);let
|
|
52
|
-
`)}\n})`:`createV5Theme()`;
|
|
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: {
|
|
53
55
|
...defaultConfig.tokens,
|
|
54
56
|
...tokens,
|
|
55
57
|
color: {
|
|
@@ -72,7 +74,14 @@ Re-run Razorwind generate when tokens change so \`${e.outFile}\` stays aligned w
|
|
|
72
74
|
...defaultConfig.tokens.zIndex,
|
|
73
75
|
...tokens.zIndex
|
|
74
76
|
}
|
|
75
|
-
}`):
|
|
76
|
-
|
|
77
|
-
|
|
77
|
+
}`):M.push(` tokens`)),M.push(` themes`),T.size>0){let e=[...T.entries()].map(([e,t])=>` ${e}: ${t}`);r?M.push(` fonts: {
|
|
78
|
+
...defaultConfig.fonts,
|
|
79
|
+
${e.join(`,
|
|
80
|
+
`)}
|
|
81
|
+
}`):M.push(` fonts: {
|
|
82
|
+
${e.join(`,
|
|
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`},`typescript`),[d]:r(d,c,{name:`razorwind-tamagui`},`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};
|
|
78
87
|
//# 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.36",
|
|
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.
|
|
88
|
+
"@razorwind/core": "^0.0.48",
|
|
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": "
|
|
107
|
+
"gitHead": "c53ec72420850efd1c4f8339b264c33ca6b9870b"
|
|
108
108
|
}
|