@razorwind/tamagui 0.0.38 → 0.0.40
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 +20 -20
- package/dist/index.d.cts +49 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +49 -3
- package/dist/index.mjs +20 -20
- package/package.json +3 -3
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
|
|
2
|
+
`,`\\n`).replaceAll(`\r`,`\\r`)}function a(e){return typeof e==`string`?`"${i(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function o(e,t){if(typeof e==`number`)return e;if(typeof e==`boolean`)return Number(e);if((0,n.isObject)(e)&&typeof e.value==`number`&&typeof e.unit==`string`){let t=e.unit.toLowerCase();return t===`px`||t===``?e.value:t===`rem`?e.value*16:`${e.value}${e.unit}`}if(typeof e==`string`){let t=/^(-?\d+(?:\.\d+)?)px$/i.exec(e.trim());if(t)return Number(t[1]);let n=/^(-?\d+(?:\.\d+)?)rem$/i.exec(e.trim());if(n)return Number(n[1])*16;let r=Number(e);return!Number.isNaN(r)&&e.trim()!==``?r:e}return String(e)}const s=[{prefix:/^(?:color|colours?|palette)\b/i,category:`color`},{prefix:/^(?:space|spacing|gap|inset)\b/i,category:`space`},{prefix:/^(?:size|sizing)\b/i,category:`size`},{prefix:/^(?:radius|rounded|radii)\b/i,category:`radius`},{prefix:/^(?:z-?index|zindex|elevation)\b/i,category:`zIndex`}];function c(e){return`$value`in e||`value`in e||`$ref`in e||`ref`in e}function l(e){return e===!0||e===`true`||e===1}function u(e){return l(e.palette)||l(e.$palette)?!0:p(e)===`palette`}function d(e,t){return(e===`palette`||e===`$palette`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function f(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function p(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function m(e){if(`$value`in e)return e.$value;if(`value`in e)return e.value;if(typeof e.$ref==`string`)return e.$ref;if(typeof e.ref==`string`)return e.ref}function h(e,t){for(let{prefix:t,category:n}of s)if(t.test(e))return n;if(t===`color`||t===`palette`)return`color`;if(t===`dimension`){if(/space|spacing|gap|inset/i.test(e))return`space`;if(/radius|rounded/i.test(e))return`radius`;if(/z-?index|elevation/i.test(e))return`zIndex`;if(/size|sizing|width|height/i.test(e))return`size`}if(t===`number`&&/z-?index|elevation/i.test(e))return`zIndex`}function g(e){return e.flatMap(e=>e.split(/[-_\s]+/)).filter(Boolean).map((e,t)=>{if(/^\d/.test(e))return e;let n=e.toLowerCase();return t===0?n:`${n.charAt(0).toUpperCase()}${n.slice(1)}`}).join(``)}function _(e){let t=e.split(`.`).filter(Boolean),n=t[0];n&&/^(?:color|colours?|palette|space|spacing|gap|inset|size|sizing|radius|rounded|radii|z-?index|zindex|elevation)$/i.test(n)&&t.shift();let r=t.length>0?t:e.split(`.`).slice(-1);return r.length===1&&/^(?:DEFAULT|default)$/i.test(r[0]??``)?`true`:g(r)}function v(e,t,r,i,a,s){if(!(0,n.isObject)(e))return;let l=a||u(e),g=p(e,r);if(c(e)){let r=m(e),a=t.join(`.`),c=h(a,g)??(l||g===`palette`?`color`:void 0),u=(0,n.formatTokenValue)(r,g),d=c===`color`||g===`color`||g===`palette`?u:o(r,g);s.push({path:a,type:g===`palette`?`color`:g,value:r,cssValue:u,tamaguiValue:d,category:c,tokenKey:c?_(a):void 0,description:f(e),theme:i,palette:l||void 0});return}for(let[n,r]of Object.entries(e))n.startsWith(`$`)&&n!==`$palette`||d(n,r)||v(r,[...t,n],g,i,l,s)}function y(e,t={}){let r=t.includeTypes?new Set(t.includeTypes):void 0,i=[];for(let t of(0,n.resolveTokenSets)(e)){let e=t.id==="default"?void 0:t.id;v(t.tokens,[],void 0,e,!1,i)}return r?i.filter(e=>!e.type||r.has(e.type)):i}function b(e){return`# Installing Tamagui Config
|
|
3
3
|
|
|
4
4
|
Generated by \`@razorwind/tamagui\`.
|
|
5
5
|
|
|
6
6
|
## Files
|
|
7
7
|
|
|
8
|
-
- \`${e.outputPath}\` — Tamagui v5 config (\`createTamagui\` +
|
|
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
|
|
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
|
|
41
|
-
`)}\n${` `.repeat(Math.max(t-2,0))}}`}function
|
|
42
|
-
light: ${
|
|
43
|
-
dark: ${
|
|
40
|
+
`}const x=new Set([`default`,`light`,`theme`]),S=/^base(?:[A-Z]\w*|[._-].+)?$/i,C=[`base`,`gray`,`grey`,`neutral`],w={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function T(e){return x.has(e)}function E(e){return e===`dark`}function D(e,t){let n=new Map,r=t===`dark`?E:T;for(let t of e){let e=t.theme?.toLowerCase();(!e||S.test(e))&&n.set(t.path,t)}for(let t of e){let e=t.theme?.toLowerCase();e&&r(e)&&n.set(t.path,t)}return[...n.values()]}function ee(e){let t={};for(let n of e){if(!n.category||!n.tokenKey)continue;let e=t[n.category]??{};e[n.tokenKey]=n.tamaguiValue,t[n.category]=e}return t}function O(e,t=2){let n=` `.repeat(t),r=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0}));return r.length===0?`{}`:`{\n${r.map(([e,t])=>{let r=/^[A-Z_$][\w$]*$/i.test(e)?e:a(e);return`${n}${r}: ${a(t)}`}).join(`,
|
|
41
|
+
`)}\n${` `.repeat(Math.max(t-2,0))}}`}function k(e){if(e>=1&&e<=12)return e;if(e>=100&&e<=900&&e%100==0)return e/100}function A(e){let t=e.path.split(`.`).filter(Boolean),n=t.at(-1);if(n&&/^\d+$/.test(n)){let e=k(Number(n)),r=t.at(-2);if(e!=null&&r&&!/^(?:color|colours?|palette)$/i.test(r))return{name:g([r]),step:e}}if(!e.tokenKey)return;let r=/^([A-Z]+)(\d{1,3})$/i.exec(e.tokenKey);if(!r)return;let[,i=``,a=``]=r,o=k(Number(a));if(o!=null)return{name:i,step:o}}function j(e,t,n,r){let i=e[t]??{};i[`${t}${n}`]=r,e[t]=i}function M(e){let t={};for(let n of e){if(typeof n.tamaguiValue!=`string`)continue;let e=A(n);e&&j(t,e.name,e.step,n.tamaguiValue)}return Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=3))}function N(e){let t={};for(let n of e){if(!n.palette||typeof n.tamaguiValue!=`string`)continue;let e=A(n);e&&j(t,e.name,e.step,n.tamaguiValue)}let n=Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=2));return Object.keys(n).length>0?n:M(e)}function P(e,t){if(e.length<2)return[...e];let n=B(e[0]),r=B(e[e.length-1]);if(n==null||r==null||n===r)return[...e];let i=n>r;return t===`light`?i?[...e]:e.toReversed():i?e.toReversed():[...e]}function F(e){return e<=.04045?e/12.92:((e+.055)/1.055)**2.4}function I(e){let t=e.startsWith(`#`)?e.slice(1):``;if((t.length===3||t.length===4)&&(t=[...t].map(e=>e+e).join(``)),t.length===8&&(t=t.slice(0,6)),t.length!==6||/[^0-9a-f]/i.test(t))return;let n=Number.parseInt(t.slice(0,2),16)/255,r=Number.parseInt(t.slice(2,4),16)/255,i=Number.parseInt(t.slice(4,6),16)/255;return .2126*F(n)+.7152*F(r)+.0722*F(i)}function L(e){let t=e.trim();if(t.endsWith(`%`)){let e=Number.parseFloat(t);return Number.isFinite(e)?e/100:void 0}let n=Number.parseFloat(t);return Number.isFinite(n)?n:void 0}function R(e){return e>1?e/100:e}function z(e,t){let n=RegExp(`^${t}\\((.+)\\)$`,`i`).exec(e.trim());if(n?.[1])return n[1].split(/[\s,/]+/).filter(Boolean)}function B(e){let t=e.trim();if(!t||t.startsWith(`var(`)||t.includes(`{`))return;let n=I(t);if(n!=null)return n;let r=z(t,`oklch`);if(r?.[0]){let e=L(r[0]);return e==null?void 0:R(e)}let i=z(t,`hsla?`);if(i?.[2]){let e=L(i[2]);return e==null?void 0:R(e)}let a=z(t,`rgba?`);if(a?.[0]&&a[1]&&a[2]){let e=L(a[0]),t=L(a[1]),n=L(a[2]);if(e==null||t==null||n==null)return;let r=(e,t)=>t.trim().endsWith(`%`)||e<=1?e:e/255;return .2126*F(r(e,a[0]))+.7152*F(r(t,a[1]))+.0722*F(r(n,a[2]))}}function V(e,t){let n=[],r=t.toLowerCase();for(let[i,a]of Object.entries(e)){if(!i.toLowerCase().startsWith(r))continue;let e=i.slice(t.length);/^\d+$/.test(e)&&n.push([Number(e),a])}return n.sort(([e],[t])=>e-t),n}function H(e,t,n){let r=V(e,t);if(r.length===0)return e;let i=P(r.map(([,e])=>e),n),a={};for(let[e,[n]]of r.entries())a[`${t}${n}`]=i[e]??r[e][1];return a}function te(e){if(e.length>=12)return e.slice(0,12);let t=[...e],n=t.at(-1);if(n==null)return t;for(;t.length<12;)t.push(n);return t}function U(e,t,n){let r=V(e,t);if(!(r.length<2))return te(P(r.map(([,e])=>e),n))}function W(e,t){let n=new Map(Object.entries(e).map(([e,t])=>[e.toLowerCase(),{name:e,scale:t}]));for(let e of C){let r=n.get(e);if(!r)continue;let i=U(r.scale,r.name,t);if(i)return i}}function G(e){let t=e.filter(e=>e.category===`color`||e.palette),n=N(D(t,`light`)),r=N(D(t,`dark`));return{lightPalette:W(n,`light`),darkPalette:W(r,`dark`)}}function K(e){let t=N(e),n={};for(let r of e)r.category!==`color`||!r.tokenKey||typeof r.tamaguiValue!=`string`||r.palette||/^[A-Z]+\d{1,3}$/i.test(r.tokenKey)&&t[r.tokenKey.replace(/\d{1,3}$/,``)]||(n[r.tokenKey]=r.tamaguiValue);return n}function q(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);if(n.size===0)return;let r=[];for(let i of[...n].toSorted((e,t)=>e.localeCompare(t))){let n=H(e[i]??t[i]??{},i,`light`),a=H(t[i]??e[i]??{},i,`dark`);Object.keys(n).length!==0&&Object.keys(a).length!==0&&r.push(` ${i}: {
|
|
42
|
+
light: ${O(n,8)},
|
|
43
|
+
dark: ${O(a,8)}
|
|
44
44
|
}`)}if(r.length!==0)return`{\n${r.join(`,
|
|
45
|
-
`)}\n }`}function
|
|
46
|
-
`)}\n }`}function
|
|
47
|
-
`)}function
|
|
45
|
+
`)}\n }`}function J(e){switch(e.role){case`heading`:case`display`:return`heading`;case`mono`:case`code`:return`mono`;case`sans`:case`body`:case`serif`:return`body`;case void 0:default:return e.name?.replaceAll(/\W/g,``)||`body`}}function Y(e){let t=new Map;for(let n of Object.values(e)){let e=J(n),r=t.get(e);(!r||n.role===e&&r.role!==e)&&t.set(e,n)}return t}function X(e){let t=new Map;for(let n of e.files){let e=String(n.weight??400),i=(0,r.basename)(n.path).replace(/\.[^.]+$/,``),a=t.get(e)??{};n.style===`italic`||n.style===`oblique`?a.italic=i:a.normal=i,t.set(e,a)}if(t.size!==0)return`{\n${[...t.entries()].toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0})).map(([e,t])=>{let n=[];return t.normal&&n.push(`normal: ${a(t.normal)}`),t.italic&&n.push(`italic: ${a(t.italic)}`),` ${e}: { ${n.join(`, `)} }`}).join(`,
|
|
46
|
+
`)}\n }`}function Z(e,n){let r=e.source===`local`?X(e):void 0,i=[`const ${n} = createFont({`,` family: isWeb ? ${a((0,t.cssFontFamily)(e))} : ${a((0,t.fontFamilyName)(e))},`,` size: {`,` 1: 12,`,` 2: 14,`,` 3: 16,`,` 4: 18,`,` 5: 20,`,` 6: 24,`,` 7: 28,`,` 8: 32,`,` 9: 40,`,` 10: 48`,` }${r?`,`:``}`];return r&&i.push(` face: ${r}`),i.push(`});`),i.join(`
|
|
47
|
+
`)}function Q(e,t={},n){let r=t.useDefaultConfig!==!1,i=t.animations??`css`,o=t.includeTypeAugmentation!==!1,s=ee(D(e,`light`)),c=e.filter(e=>e.category===`color`),l=D(c,`light`),u=D(c,`dark`),d=N(l),f=N(u.length>0?u:l),{lightPalette:p,darkPalette:m}=G(e),h=q(d,f),g=K(l),_=K(u.length>0?u:l),v=Object.keys(g).length>0||Object.keys(_).length>0,y=[];for(let e of[`color`,`space`,`size`,`radius`,`zIndex`]){let t=s[e];t&&Object.keys(t).length>0&&y.push(` ${e}: ${O(t,4)}`)}let b=[];p&&b.push(` lightPalette: ${a(p)}`),m&&b.push(` darkPalette: ${a(m)}`),h&&b.push(` childrenThemes: ${h}`),v&&b.push(` getTheme: ({ scheme }) => {
|
|
48
48
|
const semantic = scheme === "dark"
|
|
49
|
-
? ${
|
|
50
|
-
: ${
|
|
49
|
+
? ${O(_,8)}
|
|
50
|
+
: ${O(g,8)};
|
|
51
51
|
return semantic;
|
|
52
|
-
}`);let
|
|
53
|
-
`),`});`,``);let
|
|
54
|
-
`)}\n})`:`createV5Theme()`;
|
|
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: {
|
|
55
55
|
...defaultConfig.tokens,
|
|
56
56
|
...tokens,
|
|
57
57
|
color: {
|
|
@@ -74,13 +74,13 @@ Re-run Razorwind generate when tokens change so \`${e.outputPath}\` stays aligne
|
|
|
74
74
|
...defaultConfig.tokens.zIndex,
|
|
75
75
|
...tokens.zIndex
|
|
76
76
|
}
|
|
77
|
-
}`):
|
|
77
|
+
}`):A.push(` tokens`)),A.push(` themes`),k.size>0){let e=[...k.entries()].map(([e,t])=>` ${e}: ${t}`);r?A.push(` fonts: {
|
|
78
78
|
...defaultConfig.fonts,
|
|
79
79
|
${e.join(`,
|
|
80
80
|
`)}
|
|
81
|
-
}`):
|
|
81
|
+
}`):A.push(` fonts: {
|
|
82
82
|
${e.join(`,
|
|
83
83
|
`)}
|
|
84
|
-
}`)}return
|
|
85
|
-
`),`});`,``,`export type AppConfig = typeof config;`,``),o&&
|
|
86
|
-
`)}function
|
|
84
|
+
}`)}return T.push(`export const config = createTamagui({`,A.join(`,
|
|
85
|
+
`),`});`,``,`export type AppConfig = typeof config;`,``),o&&T.push(`declare module "tamagui" {`,` // eslint-disable-next-line @typescript-eslint/no-empty-object-type`,` interface TamaguiCustomConfig extends AppConfig {}`,`}`,``),T.push(`export default config;`,``),T.join(`
|
|
86
|
+
`)}function $(e,t={}){let i=e.tokens&&Object.keys(e.tokens).length>0,a=e.fonts&&Object.keys(e.fonts).length>0;if(!i&&!a)return{};let o=i?y(e.tokens,t):[];if(o.length===0&&!a)return{};let s=t.outputPath??`tamagui.config.ts`,c=Q(o,t,e.fonts),l=t.installGuide??b({outputPath:s}),u=(0,r.join)((0,r.dirname)(s),`INSTALL.md`);return{[s]:(0,n.createDocument)(s,c,{name:`razorwind-tamagui`},!1,`typescript`),[u]:(0,n.createDocument)(u,l,{name:`razorwind-tamagui`},!1,`markdown`)}}var ne=(0,e.definePlugin)(e=>({name:`tamagui`,themeGeneration:`combined`,generate:async t=>$(t,e??{})}));exports.collectColorScales=N,exports.colorLightness=B,exports.default=ne,exports.flattenTokens=y,Object.defineProperty(exports,"formatTokenValue",{enumerable:!0,get:function(){return n.formatTokenValue}}),exports.generateTamaguiConfig=$,exports.isPaletteGroup=u,exports.orderPaletteForScheme=P,exports.renderInstallMd=b,exports.renderTamaguiConfig=Q,exports.resolveTokenCategory=h,exports.resolveTokenSets=n.resolveTokenSets,exports.toCamelCaseKey=g,Object.defineProperty(exports,"toCssVar",{enumerable:!0,get:function(){return n.toCssVar}}),exports.toTamaguiValue=o,exports.toTokenKey=_;
|
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;
|
|
@@ -78,18 +81,38 @@ interface FlatToken {
|
|
|
78
81
|
description?: string;
|
|
79
82
|
/** Theme / set id when tokens are a `Record<string, Tokens>`. */
|
|
80
83
|
theme?: string;
|
|
84
|
+
/**
|
|
85
|
+
* True when an ancestor group is marked as a palette (`palette: true` or
|
|
86
|
+
* `$type: "palette"`). Those scales feed Tamagui `childrenThemes` /
|
|
87
|
+
* `lightPalette` / `darkPalette`.
|
|
88
|
+
*/
|
|
89
|
+
palette?: boolean;
|
|
81
90
|
}
|
|
82
91
|
//#endregion
|
|
83
92
|
//#region src/flatten.d.ts
|
|
93
|
+
/**
|
|
94
|
+
* True when a DTCG group is explicitly a color palette.
|
|
95
|
+
*
|
|
96
|
+
* Accepts `palette: true`, `$palette: true`, or `$type: "palette"`.
|
|
97
|
+
*/
|
|
98
|
+
declare function isPaletteGroup(node: Record<string, unknown>): boolean;
|
|
84
99
|
/**
|
|
85
100
|
* Map a DTCG token path + type onto a Tamagui `createTokens` category.
|
|
86
101
|
*/
|
|
87
102
|
declare function resolveTokenCategory(path: string, type?: string): TamaguiTokenCategory | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Join path/kebab segments into a camelCase Tamagui token key.
|
|
105
|
+
*
|
|
106
|
+
* `background` + `accent-subtle` → `backgroundAccentSubtle`.
|
|
107
|
+
* Numeric steps stay attached (`blue` + `1` → `blue1`).
|
|
108
|
+
*/
|
|
109
|
+
declare function toCamelCaseKey(parts: string[]): string;
|
|
88
110
|
/**
|
|
89
111
|
* Derive the Tamagui token key from a DTCG path (strip category prefix).
|
|
90
112
|
*
|
|
91
113
|
* `radius.DEFAULT` → `true` (Tamagui default token convention).
|
|
92
114
|
* `color.blue.1` → `blue1`.
|
|
115
|
+
* `color.background.accent-subtle` → `backgroundAccentSubtle`.
|
|
93
116
|
*/
|
|
94
117
|
declare function toTokenKey(path: string): string;
|
|
95
118
|
/**
|
|
@@ -117,15 +140,31 @@ declare function renderInstallMd(options: {
|
|
|
117
140
|
}): string;
|
|
118
141
|
//#endregion
|
|
119
142
|
//#region src/generate.d.ts
|
|
143
|
+
type ColorScheme = "light" | "dark";
|
|
120
144
|
/**
|
|
121
|
-
*
|
|
145
|
+
* Collect color palettes for Tamagui `childrenThemes`.
|
|
122
146
|
*
|
|
123
|
-
*
|
|
147
|
+
* Groups marked `palette: true` (or `$type: "palette"`) win. When none are
|
|
148
|
+
* marked, numbered 1–12 (or 100–900) scales are used as a fallback.
|
|
124
149
|
*/
|
|
125
150
|
declare function collectColorScales(colorTokens: FlatToken[]): Record<string, Record<string, string>>;
|
|
151
|
+
/**
|
|
152
|
+
* Tamagui v5 palettes: light runs lightest → darkest, dark runs darkest →
|
|
153
|
+
* lightest (`color1`–`color12`).
|
|
154
|
+
*
|
|
155
|
+
* @see https://tamagui.dev/docs/core/config-v5#base-colors-color1-12
|
|
156
|
+
*/
|
|
157
|
+
declare function orderPaletteForScheme(values: readonly string[], scheme: ColorScheme): string[];
|
|
158
|
+
/**
|
|
159
|
+
* Approximate perceptual lightness (0–1) for hex, rgb, hsl, and oklch colors.
|
|
160
|
+
* CSS variables and unresolved aliases return `undefined`.
|
|
161
|
+
*/
|
|
162
|
+
declare function colorLightness(color: string): number | undefined;
|
|
126
163
|
/**
|
|
127
164
|
* Render a Tamagui v5 config module from flattened design tokens.
|
|
128
165
|
*
|
|
166
|
+
* Light and dark token sets are combined into one `createV5Theme` call.
|
|
167
|
+
*
|
|
129
168
|
* @see https://tamagui.dev/docs/core/config-v5
|
|
130
169
|
*/
|
|
131
170
|
declare function renderTamaguiConfig(tokens: FlatToken[], options?: TamaguiPluginOptions, fonts?: Fonts): string;
|
|
@@ -139,6 +178,13 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
|
|
|
139
178
|
* Razorwind plugin that turns design tokens into a Tamagui v5 config
|
|
140
179
|
* (`createTamagui` + `createTokens` + `createV5Theme`).
|
|
141
180
|
*
|
|
181
|
+
* Light and dark token sets are emitted as a single config: `createV5Theme`
|
|
182
|
+
* receives both `lightPalette` / `darkPalette` and `childrenThemes` with
|
|
183
|
+
* `{ light, dark }` palettes. Groups marked `palette: true` become
|
|
184
|
+
* `childrenThemes`; palettes named `base`, `grey`, `gray`, or `neutral` also
|
|
185
|
+
* set `lightPalette` / `darkPalette` (`color1`–`color12`). Light palettes are
|
|
186
|
+
* ordered lightest-first; dark palettes darkest-first.
|
|
187
|
+
*
|
|
142
188
|
* @see https://tamagui.dev/docs/core/config-v5
|
|
143
189
|
*
|
|
144
190
|
* @example
|
|
@@ -153,5 +199,5 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
|
|
|
153
199
|
*/
|
|
154
200
|
declare const _default: (options?: TamaguiPluginOptions | undefined) => import("@razorwind/core/plugin").Plugin;
|
|
155
201
|
//#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 };
|
|
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 };
|
|
157
203
|
//# 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":";;;;;;;;;;KAyBY;;;;KAMA;;;;UAMK
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/flatten.ts","../src/format.ts","../src/install.ts","../src/generate.ts","../src/index.ts"],"mappings":";;;;;;;;;;KAyBY;;;;KAMA;;;;UAMK;;;;;;;;;EASf;;;;;;;EAQA,aAAa;;;;;;;;EASb;;;;;EAMA,eAAe;;;;;;;EAQf;;;;;EAMA;;;;;UAMe;;EAEf;;EAEA,OAAO;;EAEP;;EAEA;;EAEA;;EAEA,WAAW;;EAEX;;EAEA;;EAEA;;;;;;EAMA;;;;;;;;;iBCxDc,eAAe,MAAM;;;;iBA2DrB,qBACd,cACA,gBACC;;;;;;;iBAuCa,eAAe;;;;;;;;iBA0Bf,WAAW;;;;iBAkFX,cACd,QAAQ,SAAS,eAAe,SAChC,UAAS,KAAK,wCACb;;;;;;;;;iBCnNa,eAAe,gBAAgB;;;;;;;;iBCnC/B,gBAAgB;EAAW;;;;KCiCtC;;;;;;;iBA0KW,mBACd,aAAa,cACZ,eAAe;;;;;;;iBAmCF,sBACd,2BACA,QAAQ;;;;;iBA+EM,eAAe;;;;;;;;iBAsWf,oBACd,QAAQ,aACR,UAAS,sBACT,QAAQ;;;;iBAuNM,sBACd,MAAM,QACN,UAAS,uBACR,wBAAwB,QAAQ"}
|
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;
|
|
@@ -78,18 +81,38 @@ interface FlatToken {
|
|
|
78
81
|
description?: string;
|
|
79
82
|
/** Theme / set id when tokens are a `Record<string, Tokens>`. */
|
|
80
83
|
theme?: string;
|
|
84
|
+
/**
|
|
85
|
+
* True when an ancestor group is marked as a palette (`palette: true` or
|
|
86
|
+
* `$type: "palette"`). Those scales feed Tamagui `childrenThemes` /
|
|
87
|
+
* `lightPalette` / `darkPalette`.
|
|
88
|
+
*/
|
|
89
|
+
palette?: boolean;
|
|
81
90
|
}
|
|
82
91
|
//#endregion
|
|
83
92
|
//#region src/flatten.d.ts
|
|
93
|
+
/**
|
|
94
|
+
* True when a DTCG group is explicitly a color palette.
|
|
95
|
+
*
|
|
96
|
+
* Accepts `palette: true`, `$palette: true`, or `$type: "palette"`.
|
|
97
|
+
*/
|
|
98
|
+
declare function isPaletteGroup(node: Record<string, unknown>): boolean;
|
|
84
99
|
/**
|
|
85
100
|
* Map a DTCG token path + type onto a Tamagui `createTokens` category.
|
|
86
101
|
*/
|
|
87
102
|
declare function resolveTokenCategory(path: string, type?: string): TamaguiTokenCategory | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Join path/kebab segments into a camelCase Tamagui token key.
|
|
105
|
+
*
|
|
106
|
+
* `background` + `accent-subtle` → `backgroundAccentSubtle`.
|
|
107
|
+
* Numeric steps stay attached (`blue` + `1` → `blue1`).
|
|
108
|
+
*/
|
|
109
|
+
declare function toCamelCaseKey(parts: string[]): string;
|
|
88
110
|
/**
|
|
89
111
|
* Derive the Tamagui token key from a DTCG path (strip category prefix).
|
|
90
112
|
*
|
|
91
113
|
* `radius.DEFAULT` → `true` (Tamagui default token convention).
|
|
92
114
|
* `color.blue.1` → `blue1`.
|
|
115
|
+
* `color.background.accent-subtle` → `backgroundAccentSubtle`.
|
|
93
116
|
*/
|
|
94
117
|
declare function toTokenKey(path: string): string;
|
|
95
118
|
/**
|
|
@@ -117,15 +140,31 @@ declare function renderInstallMd(options: {
|
|
|
117
140
|
}): string;
|
|
118
141
|
//#endregion
|
|
119
142
|
//#region src/generate.d.ts
|
|
143
|
+
type ColorScheme = "light" | "dark";
|
|
120
144
|
/**
|
|
121
|
-
*
|
|
145
|
+
* Collect color palettes for Tamagui `childrenThemes`.
|
|
122
146
|
*
|
|
123
|
-
*
|
|
147
|
+
* Groups marked `palette: true` (or `$type: "palette"`) win. When none are
|
|
148
|
+
* marked, numbered 1–12 (or 100–900) scales are used as a fallback.
|
|
124
149
|
*/
|
|
125
150
|
declare function collectColorScales(colorTokens: FlatToken[]): Record<string, Record<string, string>>;
|
|
151
|
+
/**
|
|
152
|
+
* Tamagui v5 palettes: light runs lightest → darkest, dark runs darkest →
|
|
153
|
+
* lightest (`color1`–`color12`).
|
|
154
|
+
*
|
|
155
|
+
* @see https://tamagui.dev/docs/core/config-v5#base-colors-color1-12
|
|
156
|
+
*/
|
|
157
|
+
declare function orderPaletteForScheme(values: readonly string[], scheme: ColorScheme): string[];
|
|
158
|
+
/**
|
|
159
|
+
* Approximate perceptual lightness (0–1) for hex, rgb, hsl, and oklch colors.
|
|
160
|
+
* CSS variables and unresolved aliases return `undefined`.
|
|
161
|
+
*/
|
|
162
|
+
declare function colorLightness(color: string): number | undefined;
|
|
126
163
|
/**
|
|
127
164
|
* Render a Tamagui v5 config module from flattened design tokens.
|
|
128
165
|
*
|
|
166
|
+
* Light and dark token sets are combined into one `createV5Theme` call.
|
|
167
|
+
*
|
|
129
168
|
* @see https://tamagui.dev/docs/core/config-v5
|
|
130
169
|
*/
|
|
131
170
|
declare function renderTamaguiConfig(tokens: FlatToken[], options?: TamaguiPluginOptions, fonts?: Fonts): string;
|
|
@@ -139,6 +178,13 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
|
|
|
139
178
|
* Razorwind plugin that turns design tokens into a Tamagui v5 config
|
|
140
179
|
* (`createTamagui` + `createTokens` + `createV5Theme`).
|
|
141
180
|
*
|
|
181
|
+
* Light and dark token sets are emitted as a single config: `createV5Theme`
|
|
182
|
+
* receives both `lightPalette` / `darkPalette` and `childrenThemes` with
|
|
183
|
+
* `{ light, dark }` palettes. Groups marked `palette: true` become
|
|
184
|
+
* `childrenThemes`; palettes named `base`, `grey`, `gray`, or `neutral` also
|
|
185
|
+
* set `lightPalette` / `darkPalette` (`color1`–`color12`). Light palettes are
|
|
186
|
+
* ordered lightest-first; dark palettes darkest-first.
|
|
187
|
+
*
|
|
142
188
|
* @see https://tamagui.dev/docs/core/config-v5
|
|
143
189
|
*
|
|
144
190
|
* @example
|
|
@@ -153,5 +199,5 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
|
|
|
153
199
|
*/
|
|
154
200
|
declare const _default: (options?: TamaguiPluginOptions | undefined) => import("@razorwind/core/plugin").Plugin;
|
|
155
201
|
//#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 };
|
|
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 };
|
|
157
203
|
//# 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
|
|
2
|
+
`,`\\n`).replaceAll(`\r`,`\\r`)}function f(e){return typeof e==`string`?`"${d(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function p(e,t){if(typeof e==`number`)return e;if(typeof e==`boolean`)return Number(e);if(a(e)&&typeof e.value==`number`&&typeof e.unit==`string`){let t=e.unit.toLowerCase();return t===`px`||t===``?e.value:t===`rem`?e.value*16:`${e.value}${e.unit}`}if(typeof e==`string`){let t=/^(-?\d+(?:\.\d+)?)px$/i.exec(e.trim());if(t)return Number(t[1]);let n=/^(-?\d+(?:\.\d+)?)rem$/i.exec(e.trim());if(n)return Number(n[1])*16;let r=Number(e);return!Number.isNaN(r)&&e.trim()!==``?r:e}return String(e)}const m=[{prefix:/^(?:color|colours?|palette)\b/i,category:`color`},{prefix:/^(?:space|spacing|gap|inset)\b/i,category:`space`},{prefix:/^(?:size|sizing)\b/i,category:`size`},{prefix:/^(?:radius|rounded|radii)\b/i,category:`radius`},{prefix:/^(?:z-?index|zindex|elevation)\b/i,category:`zIndex`}];function h(e){return`$value`in e||`value`in e||`$ref`in e||`ref`in e}function g(e){return e===!0||e===`true`||e===1}function _(e){return g(e.palette)||g(e.$palette)?!0:b(e)===`palette`}function v(e,t){return(e===`palette`||e===`$palette`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function y(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function b(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function x(e){if(`$value`in e)return e.$value;if(`value`in e)return e.value;if(typeof e.$ref==`string`)return e.$ref;if(typeof e.ref==`string`)return e.ref}function S(e,t){for(let{prefix:t,category:n}of m)if(t.test(e))return n;if(t===`color`||t===`palette`)return`color`;if(t===`dimension`){if(/space|spacing|gap|inset/i.test(e))return`space`;if(/radius|rounded/i.test(e))return`radius`;if(/z-?index|elevation/i.test(e))return`zIndex`;if(/size|sizing|width|height/i.test(e))return`size`}if(t===`number`&&/z-?index|elevation/i.test(e))return`zIndex`}function C(e){return e.flatMap(e=>e.split(/[-_\s]+/)).filter(Boolean).map((e,t)=>{if(/^\d/.test(e))return e;let n=e.toLowerCase();return t===0?n:`${n.charAt(0).toUpperCase()}${n.slice(1)}`}).join(``)}function w(e){let t=e.split(`.`).filter(Boolean),n=t[0];n&&/^(?:color|colours?|palette|space|spacing|gap|inset|size|sizing|radius|rounded|radii|z-?index|zindex|elevation)$/i.test(n)&&t.shift();let r=t.length>0?t:e.split(`.`).slice(-1);return r.length===1&&/^(?:DEFAULT|default)$/i.test(r[0]??``)?`true`:C(r)}function T(e,t,n,r,o,s){if(!a(e))return;let c=o||_(e),l=b(e,n);if(h(e)){let n=x(e),a=t.join(`.`),o=S(a,l)??(c||l===`palette`?`color`:void 0),u=i(n,l),d=o===`color`||l===`color`||l===`palette`?u:p(n,l);s.push({path:a,type:l===`palette`?`color`:l,value:n,cssValue:u,tamaguiValue:d,category:o,tokenKey:o?w(a):void 0,description:y(e),theme:r,palette:c||void 0});return}for(let[n,i]of Object.entries(e))n.startsWith(`$`)&&n!==`$palette`||v(n,i)||T(i,[...t,n],l,r,c,s)}function E(e,t={}){let n=t.includeTypes?new Set(t.includeTypes):void 0,r=[];for(let t of o(e)){let e=t.id==="default"?void 0:t.id;T(t.tokens,[],void 0,e,!1,r)}return n?r.filter(e=>!e.type||n.has(e.type)):r}function D(e){return`# Installing Tamagui Config
|
|
3
3
|
|
|
4
4
|
Generated by \`@razorwind/tamagui\`.
|
|
5
5
|
|
|
6
6
|
## Files
|
|
7
7
|
|
|
8
|
-
- \`${e.outputPath}\` — Tamagui v5 config (\`createTamagui\` +
|
|
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
|
|
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
|
|
41
|
-
`)}\n${` `.repeat(Math.max(t-2,0))}}`}function
|
|
42
|
-
light: ${
|
|
43
|
-
dark: ${
|
|
40
|
+
`}const O=new Set([`default`,`light`,`theme`]),k=/^base(?:[A-Z]\w*|[._-].+)?$/i,A=[`base`,`gray`,`grey`,`neutral`],j={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function M(e){return O.has(e)}function N(e){return e===`dark`}function P(e,t){let n=new Map,r=t===`dark`?N:M;for(let t of e){let e=t.theme?.toLowerCase();(!e||k.test(e))&&n.set(t.path,t)}for(let t of e){let e=t.theme?.toLowerCase();e&&r(e)&&n.set(t.path,t)}return[...n.values()]}function ee(e){let t={};for(let n of e){if(!n.category||!n.tokenKey)continue;let e=t[n.category]??{};e[n.tokenKey]=n.tamaguiValue,t[n.category]=e}return t}function F(e,t=2){let n=` `.repeat(t),r=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0}));return r.length===0?`{}`:`{\n${r.map(([e,t])=>{let r=/^[A-Z_$][\w$]*$/i.test(e)?e:f(e);return`${n}${r}: ${f(t)}`}).join(`,
|
|
41
|
+
`)}\n${` `.repeat(Math.max(t-2,0))}}`}function I(e){if(e>=1&&e<=12)return e;if(e>=100&&e<=900&&e%100==0)return e/100}function L(e){let t=e.path.split(`.`).filter(Boolean),n=t.at(-1);if(n&&/^\d+$/.test(n)){let e=I(Number(n)),r=t.at(-2);if(e!=null&&r&&!/^(?:color|colours?|palette)$/i.test(r))return{name:C([r]),step:e}}if(!e.tokenKey)return;let r=/^([A-Z]+)(\d{1,3})$/i.exec(e.tokenKey);if(!r)return;let[,i=``,a=``]=r,o=I(Number(a));if(o!=null)return{name:i,step:o}}function R(e,t,n,r){let i=e[t]??{};i[`${t}${n}`]=r,e[t]=i}function z(e){let t={};for(let n of e){if(typeof n.tamaguiValue!=`string`)continue;let e=L(n);e&&R(t,e.name,e.step,n.tamaguiValue)}return Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=3))}function B(e){let t={};for(let n of e){if(!n.palette||typeof n.tamaguiValue!=`string`)continue;let e=L(n);e&&R(t,e.name,e.step,n.tamaguiValue)}let n=Object.fromEntries(Object.entries(t).filter(([,e])=>Object.keys(e).length>=2));return Object.keys(n).length>0?n:z(e)}function V(e,t){if(e.length<2)return[...e];let n=q(e[0]),r=q(e[e.length-1]);if(n==null||r==null||n===r)return[...e];let i=n>r;return t===`light`?i?[...e]:e.toReversed():i?e.toReversed():[...e]}function H(e){return e<=.04045?e/12.92:((e+.055)/1.055)**2.4}function U(e){let t=e.startsWith(`#`)?e.slice(1):``;if((t.length===3||t.length===4)&&(t=[...t].map(e=>e+e).join(``)),t.length===8&&(t=t.slice(0,6)),t.length!==6||/[^0-9a-f]/i.test(t))return;let n=Number.parseInt(t.slice(0,2),16)/255,r=Number.parseInt(t.slice(2,4),16)/255,i=Number.parseInt(t.slice(4,6),16)/255;return .2126*H(n)+.7152*H(r)+.0722*H(i)}function W(e){let t=e.trim();if(t.endsWith(`%`)){let e=Number.parseFloat(t);return Number.isFinite(e)?e/100:void 0}let n=Number.parseFloat(t);return Number.isFinite(n)?n:void 0}function G(e){return e>1?e/100:e}function K(e,t){let n=RegExp(`^${t}\\((.+)\\)$`,`i`).exec(e.trim());if(n?.[1])return n[1].split(/[\s,/]+/).filter(Boolean)}function q(e){let t=e.trim();if(!t||t.startsWith(`var(`)||t.includes(`{`))return;let n=U(t);if(n!=null)return n;let r=K(t,`oklch`);if(r?.[0]){let e=W(r[0]);return e==null?void 0:G(e)}let i=K(t,`hsla?`);if(i?.[2]){let e=W(i[2]);return e==null?void 0:G(e)}let a=K(t,`rgba?`);if(a?.[0]&&a[1]&&a[2]){let e=W(a[0]),t=W(a[1]),n=W(a[2]);if(e==null||t==null||n==null)return;let r=(e,t)=>t.trim().endsWith(`%`)||e<=1?e:e/255;return .2126*H(r(e,a[0]))+.7152*H(r(t,a[1]))+.0722*H(r(n,a[2]))}}function J(e,t){let n=[],r=t.toLowerCase();for(let[i,a]of Object.entries(e)){if(!i.toLowerCase().startsWith(r))continue;let e=i.slice(t.length);/^\d+$/.test(e)&&n.push([Number(e),a])}return n.sort(([e],[t])=>e-t),n}function Y(e,t,n){let r=J(e,t);if(r.length===0)return e;let i=V(r.map(([,e])=>e),n),a={};for(let[e,[n]]of r.entries())a[`${t}${n}`]=i[e]??r[e][1];return a}function te(e){if(e.length>=12)return e.slice(0,12);let t=[...e],n=t.at(-1);if(n==null)return t;for(;t.length<12;)t.push(n);return t}function ne(e,t,n){let r=J(e,t);if(!(r.length<2))return te(V(r.map(([,e])=>e),n))}function X(e,t){let n=new Map(Object.entries(e).map(([e,t])=>[e.toLowerCase(),{name:e,scale:t}]));for(let e of A){let r=n.get(e);if(!r)continue;let i=ne(r.scale,r.name,t);if(i)return i}}function re(e){let t=e.filter(e=>e.category===`color`||e.palette),n=B(P(t,`light`)),r=B(P(t,`dark`));return{lightPalette:X(n,`light`),darkPalette:X(r,`dark`)}}function Z(e){let t=B(e),n={};for(let r of e)r.category!==`color`||!r.tokenKey||typeof r.tamaguiValue!=`string`||r.palette||/^[A-Z]+\d{1,3}$/i.test(r.tokenKey)&&t[r.tokenKey.replace(/\d{1,3}$/,``)]||(n[r.tokenKey]=r.tamaguiValue);return n}function ie(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);if(n.size===0)return;let r=[];for(let i of[...n].toSorted((e,t)=>e.localeCompare(t))){let n=Y(e[i]??t[i]??{},i,`light`),a=Y(t[i]??e[i]??{},i,`dark`);Object.keys(n).length!==0&&Object.keys(a).length!==0&&r.push(` ${i}: {
|
|
42
|
+
light: ${F(n,8)},
|
|
43
|
+
dark: ${F(a,8)}
|
|
44
44
|
}`)}if(r.length!==0)return`{\n${r.join(`,
|
|
45
|
-
`)}\n }`}function
|
|
46
|
-
`)}\n }`}function
|
|
47
|
-
`)}function
|
|
45
|
+
`)}\n }`}function ae(e){switch(e.role){case`heading`:case`display`:return`heading`;case`mono`:case`code`:return`mono`;case`sans`:case`body`:case`serif`:return`body`;case void 0:default:return e.name?.replaceAll(/\W/g,``)||`body`}}function oe(e){let t=new Map;for(let n of Object.values(e)){let e=ae(n),r=t.get(e);(!r||n.role===e&&r.role!==e)&&t.set(e,n)}return t}function se(e){let t=new Map;for(let n of e.files){let e=String(n.weight??400),r=c(n.path).replace(/\.[^.]+$/,``),i=t.get(e)??{};n.style===`italic`||n.style===`oblique`?i.italic=r:i.normal=r,t.set(e,i)}if(t.size!==0)return`{\n${[...t.entries()].toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0})).map(([e,t])=>{let n=[];return t.normal&&n.push(`normal: ${f(t.normal)}`),t.italic&&n.push(`italic: ${f(t.italic)}`),` ${e}: { ${n.join(`, `)} }`}).join(`,
|
|
46
|
+
`)}\n }`}function ce(e,r){let i=e.source===`local`?se(e):void 0,a=[`const ${r} = createFont({`,` family: isWeb ? ${f(t(e))} : ${f(n(e))},`,` size: {`,` 1: 12,`,` 2: 14,`,` 3: 16,`,` 4: 18,`,` 5: 20,`,` 6: 24,`,` 7: 28,`,` 8: 32,`,` 9: 40,`,` 10: 48`,` }${i?`,`:``}`];return i&&a.push(` face: ${i}`),a.push(`});`),a.join(`
|
|
47
|
+
`)}function Q(e,t={},n){let r=t.useDefaultConfig!==!1,i=t.animations??`css`,a=t.includeTypeAugmentation!==!1,o=ee(P(e,`light`)),s=e.filter(e=>e.category===`color`),c=P(s,`light`),l=P(s,`dark`),u=B(c),d=B(l.length>0?l:c),{lightPalette:p,darkPalette:m}=re(e),h=ie(u,d),g=Z(c),_=Z(l.length>0?l:c),v=Object.keys(g).length>0||Object.keys(_).length>0,y=[];for(let e of[`color`,`space`,`size`,`radius`,`zIndex`]){let t=o[e];t&&Object.keys(t).length>0&&y.push(` ${e}: ${F(t,4)}`)}let b=[];p&&b.push(` lightPalette: ${f(p)}`),m&&b.push(` darkPalette: ${f(m)}`),h&&b.push(` childrenThemes: ${h}`),v&&b.push(` getTheme: ({ scheme }) => {
|
|
48
48
|
const semantic = scheme === "dark"
|
|
49
|
-
? ${
|
|
50
|
-
: ${
|
|
49
|
+
? ${F(_,8)}
|
|
50
|
+
: ${F(g,8)};
|
|
51
51
|
return semantic;
|
|
52
|
-
}`);let
|
|
53
|
-
`),`});`,``);let
|
|
54
|
-
`)}\n})`:`createV5Theme()`;
|
|
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: {
|
|
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
|
-
}`):
|
|
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
|
-
}`):
|
|
81
|
+
}`):D.push(` fonts: {
|
|
82
82
|
${e.join(`,
|
|
83
83
|
`)}
|
|
84
|
-
}`)}return
|
|
85
|
-
`),`});`,``,`export type AppConfig = typeof config;`,``),a&&
|
|
86
|
-
`)}function
|
|
84
|
+
}`)}return w.push(`export const config = createTamagui({`,D.join(`,
|
|
85
|
+
`),`});`,``,`export type AppConfig = typeof config;`,``),a&&w.push(`declare module "tamagui" {`,` // eslint-disable-next-line @typescript-eslint/no-empty-object-type`,` interface TamaguiCustomConfig extends AppConfig {}`,`}`,``),w.push(`export default config;`,``),w.join(`
|
|
86
|
+
`)}function $(e,t={}){let n=e.tokens&&Object.keys(e.tokens).length>0,i=e.fonts&&Object.keys(e.fonts).length>0;if(!n&&!i)return{};let a=n?E(e.tokens,t):[];if(a.length===0&&!i)return{};let o=t.outputPath??`tamagui.config.ts`,s=Q(a,t,e.fonts),c=t.installGuide??D({outputPath:o}),d=u(l(o),`INSTALL.md`);return{[o]:r(o,s,{name:`razorwind-tamagui`},!1,`typescript`),[d]:r(d,c,{name:`razorwind-tamagui`},!1,`markdown`)}}var le=e(e=>({name:`tamagui`,themeGeneration:`combined`,generate:async t=>$(t,e??{})}));export{B as collectColorScales,q as colorLightness,le as default,E as flattenTokens,i as formatTokenValue,$ as generateTamaguiConfig,_ as isPaletteGroup,V as orderPaletteForScheme,D as renderInstallMd,Q as renderTamaguiConfig,S as resolveTokenCategory,o as resolveTokenSets,C as toCamelCaseKey,s as toCssVar,p as toTamaguiValue,w as toTokenKey};
|
|
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.
|
|
3
|
+
"version": "0.0.40",
|
|
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.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": "
|
|
107
|
+
"gitHead": "907ed672d3b6b5cf02560ede8553693f3b4073c3"
|
|
108
108
|
}
|