@terrazzo/plugin-tailwind 2.0.0-alpha.6 → 2.0.0-beta.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/lib.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;UAAiB,qBAAA;;;AAAjB;AAaA;;;SANS;ECHI;EAIW,YAAA,CAAA,EAAA;;;;;;iBDKR,eAAA,WAA0B;;;;;;cCT7B,SAAA;ADSG,iBCLQ,cAAA,CDKkB,OAAM,ECLA,qBDKA,CAAA,ECLwB,MDKxB"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/lib.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;UAAiB,qBAAA;;;AAAjB;AAaA;;;SANS;ECFI;EAIW,YAAA,CAAA,EAAA;;;;;;iBDIR,eAAA,WAA0B;;;;;;cCR7B,SAAA;ADQG,iBCJQ,cAAA,CDIkB,OAAM,ECJA,qBDIA,CAAA,ECJwB,MDIxB"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { FORMAT_ID as FORMAT_ID$1 } from "@terrazzo/plugin-css";
2
+ import { makeCSSVar } from "@terrazzo/token-tools/css";
2
3
 
3
4
  //#region src/lib.ts
4
5
  /** Flatten an arbitrarily-nested object */
@@ -53,7 +54,7 @@ function pluginTailwind(options) {
53
54
  }
54
55
  setTransform(token.id, {
55
56
  format: FORMAT_ID,
56
- localID: `--${path.join("-")}-${relName.replace(/\./g, "-")}`,
57
+ localID: makeCSSVar(`${path.join("-")}-${relName.replace(/\./g, "-")}`),
57
58
  value: typeof token.value === "object" ? token.value["."] : token.value,
58
59
  mode: variant
59
60
  });
@@ -64,7 +65,10 @@ function pluginTailwind(options) {
64
65
  async build({ getTransforms, outputFile }) {
65
66
  const output = ["@import \"tailwindcss\";", ""];
66
67
  const variants = { ".": [] };
67
- for (const token of getTransforms({ format: FORMAT_ID })) {
68
+ for (const token of getTransforms({
69
+ format: FORMAT_ID,
70
+ mode: "*"
71
+ })) {
68
72
  const { localID, value, mode } = token;
69
73
  if (!variants[mode]) variants[mode] = [];
70
74
  variants[mode].push(`${localID}: ${value};`);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["result: { path: string[]; value: string | string[] }[]","FORMAT_CSS","variants: Record<string, string[]>"],"sources":["../src/lib.ts","../src/index.ts"],"sourcesContent":["export interface TailwindPluginOptions {\n /**\n * Filename to output.\n * @default \"tailwind-theme.css\"\n */\n filename?: string;\n /** @see https://tailwindcss.com/docs/theme */\n theme: Record<string, any>;\n /** Array of mapping variants to DTCG modes. */\n modeVariants?: { variant: string; mode: string }[];\n}\n\n/** Flatten an arbitrarily-nested object */\nexport function flattenThemeObj(themeObj: Record<string, unknown>): { path: string[]; value: string | string[] }[] {\n const result: { path: string[]; value: string | string[] }[] = [];\n\n function traverse(obj: Record<string, unknown>, path: string[]) {\n for (const [key, value] of Object.entries(obj)) {\n const newPath = [...path, key];\n if (typeof value === 'string' || Array.isArray(value)) {\n if (Array.isArray(value) && (value.length === 0 || value.some((v) => typeof v !== 'string'))) {\n throw new Error(\n `Invalid value at path \"${newPath.join('.')}\": expected a string or an array of strings, but got ${JSON.stringify(value)}`,\n );\n }\n result.push({ path: newPath, value });\n } else if (typeof value === 'object' && value !== null) {\n traverse(value as Record<string, unknown>, newPath);\n }\n }\n }\n\n traverse(themeObj, []);\n return result;\n}\n","import type { Plugin } from '@terrazzo/parser';\nimport { FORMAT_ID as FORMAT_CSS } from '@terrazzo/plugin-css';\nimport { flattenThemeObj, type TailwindPluginOptions } from './lib.js';\n\nexport const FORMAT_ID = 'tailwind';\n\nexport * from './lib.js';\n\nexport default function pluginTailwind(options: TailwindPluginOptions): Plugin {\n const filename = options?.filename ?? (options as any)?.fileName ?? 'tailwind-theme.css';\n\n return {\n name: '@terrazzo/plugin-tailwind',\n enforce: 'post', // ensure this comes after @terrazzo/plugin-css\n config(config) {\n if (!config.plugins.some((p) => p.name === '@terrazzo/plugin-css')) {\n throw new Error(\n '@terrazzo/plugin-css missing! Please install and add to the plugins array to use the Tailwind plugin.',\n );\n }\n\n if (!options || !options.theme) {\n throw new Error('Missing Tailwind `theme` option.');\n }\n },\n async transform({ getTransforms, setTransform }) {\n const variants = [{ variant: '.', mode: '.' }, ...(options?.modeVariants ?? [])];\n for (const { variant, mode } of variants) {\n const flatTheme = flattenThemeObj(options.theme);\n for (const { path, value } of flatTheme) {\n const tokens = getTransforms({\n format: FORMAT_CSS,\n id: value,\n mode,\n });\n for (const token of tokens) {\n let relName = token.id.split('.').at(-1)!;\n for (const subgroup of [...(Array.isArray(value) ? value : [value])]) {\n const match = subgroup.replace(/\\*.*/, '');\n relName = token.id.replace(match, '');\n }\n setTransform(token.id, {\n format: FORMAT_ID,\n localID: `--${path.join('-')}-${relName.replace(/\\./g, '-')}`,\n value: typeof token.value === 'object' ? token.value['.']! : token.value,\n mode: variant, // ! <- not the original mode!\n });\n }\n }\n }\n },\n async build({ getTransforms, outputFile }) {\n const output = ['@import \"tailwindcss\";', ''];\n\n const variants: Record<string, string[]> = { '.': [] };\n for (const token of getTransforms({ format: FORMAT_ID })) {\n const { localID, value, mode } = token;\n if (!variants[mode]) {\n variants[mode] = [];\n }\n variants[mode].push(`${localID}: ${value};`);\n }\n for (const [variant, values] of Object.entries(variants)) {\n output.push(variant === '.' ? '@theme {' : `@variant ${variant} {`);\n for (const value of values) {\n output.push(` ${value}`);\n }\n output.push('}', '');\n }\n\n outputFile(filename, output.join('\\n'));\n },\n };\n}\n"],"mappings":";;;;AAaA,SAAgB,gBAAgB,UAAmF;CACjH,MAAMA,SAAyD,EAAE;CAEjE,SAAS,SAAS,KAA8B,MAAgB;AAC9D,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,EAAE;GAC9C,MAAM,UAAU,CAAC,GAAG,MAAM,IAAI;AAC9B,OAAI,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,EAAE;AACrD,QAAI,MAAM,QAAQ,MAAM,KAAK,MAAM,WAAW,KAAK,MAAM,MAAM,MAAM,OAAO,MAAM,SAAS,EACzF,OAAM,IAAI,MACR,0BAA0B,QAAQ,KAAK,IAAI,CAAC,uDAAuD,KAAK,UAAU,MAAM,GACzH;AAEH,WAAO,KAAK;KAAE,MAAM;KAAS;KAAO,CAAC;cAC5B,OAAO,UAAU,YAAY,UAAU,KAChD,UAAS,OAAkC,QAAQ;;;AAKzD,UAAS,UAAU,EAAE,CAAC;AACtB,QAAO;;;;;AC7BT,MAAa,YAAY;AAIzB,SAAwB,eAAe,SAAwC;CAC7E,MAAM,WAAW,SAAS,YAAa,SAAiB,YAAY;AAEpE,QAAO;EACL,MAAM;EACN,SAAS;EACT,OAAO,QAAQ;AACb,OAAI,CAAC,OAAO,QAAQ,MAAM,MAAM,EAAE,SAAS,uBAAuB,CAChE,OAAM,IAAI,MACR,wGACD;AAGH,OAAI,CAAC,WAAW,CAAC,QAAQ,MACvB,OAAM,IAAI,MAAM,mCAAmC;;EAGvD,MAAM,UAAU,EAAE,eAAe,gBAAgB;GAC/C,MAAM,WAAW,CAAC;IAAE,SAAS;IAAK,MAAM;IAAK,EAAE,GAAI,SAAS,gBAAgB,EAAE,CAAE;AAChF,QAAK,MAAM,EAAE,SAAS,UAAU,UAAU;IACxC,MAAM,YAAY,gBAAgB,QAAQ,MAAM;AAChD,SAAK,MAAM,EAAE,MAAM,WAAW,WAAW;KACvC,MAAM,SAAS,cAAc;MAC3B,QAAQC;MACR,IAAI;MACJ;MACD,CAAC;AACF,UAAK,MAAM,SAAS,QAAQ;MAC1B,IAAI,UAAU,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,GAAG;AACxC,WAAK,MAAM,YAAY,CAAC,GAAI,MAAM,QAAQ,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAE,EAAE;OACpE,MAAM,QAAQ,SAAS,QAAQ,QAAQ,GAAG;AAC1C,iBAAU,MAAM,GAAG,QAAQ,OAAO,GAAG;;AAEvC,mBAAa,MAAM,IAAI;OACrB,QAAQ;OACR,SAAS,KAAK,KAAK,KAAK,IAAI,CAAC,GAAG,QAAQ,QAAQ,OAAO,IAAI;OAC3D,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,MAAM,OAAQ,MAAM;OACnE,MAAM;OACP,CAAC;;;;;EAKV,MAAM,MAAM,EAAE,eAAe,cAAc;GACzC,MAAM,SAAS,CAAC,4BAA0B,GAAG;GAE7C,MAAMC,WAAqC,EAAE,KAAK,EAAE,EAAE;AACtD,QAAK,MAAM,SAAS,cAAc,EAAE,QAAQ,WAAW,CAAC,EAAE;IACxD,MAAM,EAAE,SAAS,OAAO,SAAS;AACjC,QAAI,CAAC,SAAS,MACZ,UAAS,QAAQ,EAAE;AAErB,aAAS,MAAM,KAAK,GAAG,QAAQ,IAAI,MAAM,GAAG;;AAE9C,QAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,SAAS,EAAE;AACxD,WAAO,KAAK,YAAY,MAAM,aAAa,YAAY,QAAQ,IAAI;AACnE,SAAK,MAAM,SAAS,OAClB,QAAO,KAAK,KAAK,QAAQ;AAE3B,WAAO,KAAK,KAAK,GAAG;;AAGtB,cAAW,UAAU,OAAO,KAAK,KAAK,CAAC;;EAE1C"}
1
+ {"version":3,"file":"index.js","names":["FORMAT_CSS"],"sources":["../src/lib.ts","../src/index.ts"],"sourcesContent":["export interface TailwindPluginOptions {\n /**\n * Filename to output.\n * @default \"tailwind-theme.css\"\n */\n filename?: string;\n /** @see https://tailwindcss.com/docs/theme */\n theme: Record<string, any>;\n /** Array of mapping variants to DTCG modes. */\n modeVariants?: { variant: string; mode: string }[];\n}\n\n/** Flatten an arbitrarily-nested object */\nexport function flattenThemeObj(themeObj: Record<string, unknown>): { path: string[]; value: string | string[] }[] {\n const result: { path: string[]; value: string | string[] }[] = [];\n\n function traverse(obj: Record<string, unknown>, path: string[]) {\n for (const [key, value] of Object.entries(obj)) {\n const newPath = [...path, key];\n if (typeof value === 'string' || Array.isArray(value)) {\n if (Array.isArray(value) && (value.length === 0 || value.some((v) => typeof v !== 'string'))) {\n throw new Error(\n `Invalid value at path \"${newPath.join('.')}\": expected a string or an array of strings, but got ${JSON.stringify(value)}`,\n );\n }\n result.push({ path: newPath, value });\n } else if (typeof value === 'object' && value !== null) {\n traverse(value as Record<string, unknown>, newPath);\n }\n }\n }\n\n traverse(themeObj, []);\n return result;\n}\n","import type { Plugin } from '@terrazzo/parser';\nimport { FORMAT_ID as FORMAT_CSS } from '@terrazzo/plugin-css';\nimport { makeCSSVar } from '@terrazzo/token-tools/css';\nimport { flattenThemeObj, type TailwindPluginOptions } from './lib.js';\n\nexport const FORMAT_ID = 'tailwind';\n\nexport * from './lib.js';\n\nexport default function pluginTailwind(options: TailwindPluginOptions): Plugin {\n const filename = options?.filename ?? (options as any)?.fileName ?? 'tailwind-theme.css';\n\n return {\n name: '@terrazzo/plugin-tailwind',\n enforce: 'post', // ensure this comes after @terrazzo/plugin-css\n config(config) {\n if (!config.plugins.some((p) => p.name === '@terrazzo/plugin-css')) {\n throw new Error(\n '@terrazzo/plugin-css missing! Please install and add to the plugins array to use the Tailwind plugin.',\n );\n }\n\n if (!options || !options.theme) {\n throw new Error('Missing Tailwind `theme` option.');\n }\n },\n async transform({ getTransforms, setTransform }) {\n const variants = [{ variant: '.', mode: '.' }, ...(options?.modeVariants ?? [])];\n for (const { variant, mode } of variants) {\n const flatTheme = flattenThemeObj(options.theme);\n for (const { path, value } of flatTheme) {\n const tokens = getTransforms({\n format: FORMAT_CSS,\n id: value,\n mode,\n });\n for (const token of tokens) {\n let relName = token.id.split('.').at(-1)!;\n for (const subgroup of [...(Array.isArray(value) ? value : [value])]) {\n const match = subgroup.replace(/\\*.*/, '');\n relName = token.id.replace(match, '');\n }\n setTransform(token.id, {\n format: FORMAT_ID,\n localID: makeCSSVar(`${path.join('-')}-${relName.replace(/\\./g, '-')}`),\n value: typeof token.value === 'object' ? token.value['.']! : token.value,\n mode: variant, // ! <- not the original mode!\n });\n }\n }\n }\n },\n async build({ getTransforms, outputFile }) {\n const output = ['@import \"tailwindcss\";', ''];\n\n const variants: Record<string, string[]> = { '.': [] };\n for (const token of getTransforms({ format: FORMAT_ID, mode: '*' })) {\n const { localID, value, mode } = token;\n if (!variants[mode]) {\n variants[mode] = [];\n }\n variants[mode].push(`${localID}: ${value};`);\n }\n for (const [variant, values] of Object.entries(variants)) {\n output.push(variant === '.' ? '@theme {' : `@variant ${variant} {`);\n for (const value of values) {\n output.push(` ${value}`);\n }\n output.push('}', '');\n }\n\n outputFile(filename, output.join('\\n'));\n },\n };\n}\n"],"mappings":";;;;;AAaA,SAAgB,gBAAgB,UAAmF;CACjH,MAAM,SAAyD,EAAE;CAEjE,SAAS,SAAS,KAA8B,MAAgB;AAC9D,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,EAAE;GAC9C,MAAM,UAAU,CAAC,GAAG,MAAM,IAAI;AAC9B,OAAI,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,EAAE;AACrD,QAAI,MAAM,QAAQ,MAAM,KAAK,MAAM,WAAW,KAAK,MAAM,MAAM,MAAM,OAAO,MAAM,SAAS,EACzF,OAAM,IAAI,MACR,0BAA0B,QAAQ,KAAK,IAAI,CAAC,uDAAuD,KAAK,UAAU,MAAM,GACzH;AAEH,WAAO,KAAK;KAAE,MAAM;KAAS;KAAO,CAAC;cAC5B,OAAO,UAAU,YAAY,UAAU,KAChD,UAAS,OAAkC,QAAQ;;;AAKzD,UAAS,UAAU,EAAE,CAAC;AACtB,QAAO;;;;;AC5BT,MAAa,YAAY;AAIzB,SAAwB,eAAe,SAAwC;CAC7E,MAAM,WAAW,SAAS,YAAa,SAAiB,YAAY;AAEpE,QAAO;EACL,MAAM;EACN,SAAS;EACT,OAAO,QAAQ;AACb,OAAI,CAAC,OAAO,QAAQ,MAAM,MAAM,EAAE,SAAS,uBAAuB,CAChE,OAAM,IAAI,MACR,wGACD;AAGH,OAAI,CAAC,WAAW,CAAC,QAAQ,MACvB,OAAM,IAAI,MAAM,mCAAmC;;EAGvD,MAAM,UAAU,EAAE,eAAe,gBAAgB;GAC/C,MAAM,WAAW,CAAC;IAAE,SAAS;IAAK,MAAM;IAAK,EAAE,GAAI,SAAS,gBAAgB,EAAE,CAAE;AAChF,QAAK,MAAM,EAAE,SAAS,UAAU,UAAU;IACxC,MAAM,YAAY,gBAAgB,QAAQ,MAAM;AAChD,SAAK,MAAM,EAAE,MAAM,WAAW,WAAW;KACvC,MAAM,SAAS,cAAc;MAC3B,QAAQA;MACR,IAAI;MACJ;MACD,CAAC;AACF,UAAK,MAAM,SAAS,QAAQ;MAC1B,IAAI,UAAU,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,GAAG;AACxC,WAAK,MAAM,YAAY,CAAC,GAAI,MAAM,QAAQ,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAE,EAAE;OACpE,MAAM,QAAQ,SAAS,QAAQ,QAAQ,GAAG;AAC1C,iBAAU,MAAM,GAAG,QAAQ,OAAO,GAAG;;AAEvC,mBAAa,MAAM,IAAI;OACrB,QAAQ;OACR,SAAS,WAAW,GAAG,KAAK,KAAK,IAAI,CAAC,GAAG,QAAQ,QAAQ,OAAO,IAAI,GAAG;OACvE,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,MAAM,OAAQ,MAAM;OACnE,MAAM;OACP,CAAC;;;;;EAKV,MAAM,MAAM,EAAE,eAAe,cAAc;GACzC,MAAM,SAAS,CAAC,4BAA0B,GAAG;GAE7C,MAAM,WAAqC,EAAE,KAAK,EAAE,EAAE;AACtD,QAAK,MAAM,SAAS,cAAc;IAAE,QAAQ;IAAW,MAAM;IAAK,CAAC,EAAE;IACnE,MAAM,EAAE,SAAS,OAAO,SAAS;AACjC,QAAI,CAAC,SAAS,MACZ,UAAS,QAAQ,EAAE;AAErB,aAAS,MAAM,KAAK,GAAG,QAAQ,IAAI,MAAM,GAAG;;AAE9C,QAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,SAAS,EAAE;AACxD,WAAO,KAAK,YAAY,MAAM,aAAa,YAAY,QAAQ,IAAI;AACnE,SAAK,MAAM,SAAS,OAClB,QAAO,KAAK,KAAK,QAAQ;AAE3B,WAAO,KAAK,KAAK,GAAG;;AAGtB,cAAW,UAAU,OAAO,KAAK,KAAK,CAAC;;EAE1C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@terrazzo/plugin-tailwind",
3
- "version": "2.0.0-alpha.6",
3
+ "version": "2.0.0-beta.0",
4
4
  "description": "Generate Tailwind v4 theme using DTCG design tokens.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -28,18 +28,19 @@
28
28
  },
29
29
  "peerDependencies": {
30
30
  "tailwindcss": "^4.0.0",
31
- "@terrazzo/cli": "^2.0.0-alpha.6",
32
- "@terrazzo/parser": "^2.0.0-alpha.6",
33
- "@terrazzo/plugin-css": "^2.0.0-alpha.6"
31
+ "@terrazzo/cli": "^2.0.0-beta.0",
32
+ "@terrazzo/parser": "^2.0.0-beta.0",
33
+ "@terrazzo/plugin-css": "^2.0.0-beta.0",
34
+ "@terrazzo/token-tools": "^2.0.0-beta.0"
34
35
  },
35
36
  "dependencies": {
36
- "@terrazzo/token-tools": "^2.0.0-alpha.6"
37
+ "@terrazzo/token-tools": "^2.0.0-beta.0"
37
38
  },
38
39
  "devDependencies": {
39
- "tailwindcss": "^4.1.17",
40
- "@terrazzo/cli": "^2.0.0-alpha.6",
41
- "@terrazzo/parser": "^2.0.0-alpha.6",
42
- "@terrazzo/plugin-css": "^2.0.0-alpha.6"
40
+ "tailwindcss": "^4.1.18",
41
+ "@terrazzo/cli": "^2.0.0-beta.0",
42
+ "@terrazzo/parser": "^2.0.0-beta.0",
43
+ "@terrazzo/plugin-css": "^2.0.0-beta.0"
43
44
  },
44
45
  "scripts": {
45
46
  "build": "rolldown -c && attw --profile esm-only --pack .",