clases 1.1.4 → 1.1.5

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
@@ -18,11 +18,21 @@ function createCl(...plugins) {
18
18
  if (typeof value === "object") {
19
19
  return Object.entries(value).map(([nestedKey, nestedValue]) => {
20
20
  const isRegistered = registry[nestedKey] !== void 0;
21
- const nextKey = isRegistered ? key ? `${key}:${nestedKey}` : nestedKey : key;
21
+ let nextKey;
22
+ if (key === "" || key === "base") {
23
+ nextKey = nestedKey;
24
+ } else if (isRegistered) {
25
+ nextKey = `${key}:${nestedKey}`;
26
+ } else {
27
+ nextKey = key;
28
+ }
22
29
  return process(nextKey, nestedValue);
23
30
  }).join(" ");
24
31
  }
25
- const resolvedPrefix = key.split(":").map((part) => registry[part] || null).filter(Boolean).join(":");
32
+ const resolvedPrefix = key.split(":").map((part) => {
33
+ if (part === "base") return null;
34
+ return registry[part] || null;
35
+ }).filter(Boolean).join(":");
26
36
  if (typeof value === "string") {
27
37
  return value.split(/[,\s\n]+/).filter(Boolean).map((cls) => !resolvedPrefix ? cls : `${resolvedPrefix}:${cls}`).join(" ");
28
38
  }
@@ -33,7 +43,8 @@ function createCl(...plugins) {
33
43
  if (input !== null && typeof input === "object" && !Array.isArray(input)) {
34
44
  return Object.entries(input).map(([k, v]) => {
35
45
  if (v === true) return k;
36
- return process(registry[k] ? k : "", v);
46
+ if (registry[k] || k === "base") return process(k, v);
47
+ return process("base", v);
37
48
  }).join(" ");
38
49
  }
39
50
  return input;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["twMerge","clsx"],"mappings":";;;;;;;;;;AAGO,SAAS,YAAuD,OAAA,EAAmB;AACtF,EAAA,MAAM,WAAmC,MAAA,CAAO,MAAA,CAAO,EAAC,EAAG,GAAG,OAAO,CAAA;AAErE,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,EAAa,KAAA,KAAuB;AACjD,IAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtB,MAAA,OAAO,KAAA,CACF,GAAA,CAAI,CAAC,CAAA,KAAM,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAC,CAAA,CAC1B,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAAA,IACjB;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,MAAA,OAAO,MAAA,CAAO,QAAQ,KAAK,CAAA,CACtB,IAAI,CAAC,CAAC,SAAA,EAAW,WAAW,CAAA,KAAM;AAC/B,QAAA,MAAM,YAAA,GAAe,QAAA,CAAS,SAAS,CAAA,KAAM,MAAA;AAG7C,QAAA,MAAM,OAAA,GAAU,eAAgB,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,SAAS,KAAK,SAAA,GAAa,GAAA;AAE3E,QAAA,OAAO,OAAA,CAAQ,SAAS,WAAW,CAAA;AAAA,MACvC,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AAAA,IACjB;AAGA,IAAA,MAAM,iBAAiB,GAAA,CAClB,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAC,IAAA,KAAS,QAAA,CAAS,IAAI,KAAK,IAAI,CAAA,CACpC,OAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEb,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,MAAA,OAAO,KAAA,CACF,MAAM,UAAU,CAAA,CAChB,OAAO,OAAO,CAAA,CACd,IAAI,CAAC,GAAA,KAAS,CAAC,cAAA,GAAiB,GAAA,GAAM,GAAG,cAAc,CAAA,CAAA,EAAI,GAAG,CAAA,CAAG,CAAA,CACjE,KAAK,GAAG,CAAA;AAAA,IACjB;AACA,IAAA,OAAO,EAAA;AAAA,EACX,CAAA;AAEA,EAAA,OAAO,IAAI,MAAA,KAAkB;AACzB,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACpC,MAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtE,QAAA,OAAO,MAAA,CAAO,QAAQ,KAAK,CAAA,CACtB,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AACb,UAAA,IAAI,CAAA,KAAM,MAAM,OAAO,CAAA;AAEvB,UAAA,OAAO,QAAQ,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,QAC1C,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AAAA,MACjB;AACA,MAAA,OAAO,KAAA;AAAA,IACX,CAAC,CAAA;AACD,IAAA,OAAOA,qBAAA,CAAQC,qBAAA,CAAK,SAAS,CAAC,CAAA;AAAA,EAClC,CAAA;AACJ","file":"index.cjs","sourcesContent":["import { twMerge } from 'tailwind-merge';\r\nimport clsx from 'clsx';\r\n\r\nexport function createCl<TPlugins extends Record<string, string>[]>(...plugins: TPlugins) {\r\n const registry: Record<string, string> = Object.assign({}, ...plugins);\r\n\r\n const process = (key: string, value: any): string => {\r\n if (!value) return '';\r\n\r\n if (Array.isArray(value)) {\r\n return value\r\n .map((v) => process(key, v))\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n if (typeof value === 'object') {\r\n return Object.entries(value)\r\n .map(([nestedKey, nestedValue]) => {\r\n const isRegistered = registry[nestedKey] !== undefined;\r\n // Si el hijo está registrado, añadimos al prefijo.\r\n // Si no, mantenemos el prefijo actual (transparencia).\r\n const nextKey = isRegistered ? (key ? `${key}:${nestedKey}` : nestedKey) : key;\r\n\r\n return process(nextKey, nestedValue);\r\n })\r\n .join(' ');\r\n }\r\n\r\n // RESOLUCIÓN: Solo lo que esté en el registro se convierte en prefijo.\r\n const resolvedPrefix = key\r\n .split(':')\r\n .map((part) => registry[part] || null)\r\n .filter(Boolean)\r\n .join(':');\r\n\r\n if (typeof value === 'string') {\r\n return value\r\n .split(/[,\\s\\n]+/)\r\n .filter(Boolean)\r\n .map((cls) => (!resolvedPrefix ? cls : `${resolvedPrefix}:${cls}`))\r\n .join(' ');\r\n }\r\n return '';\r\n };\r\n\r\n return (...inputs: any[]) => {\r\n const processed = inputs.map((input) => {\r\n if (input !== null && typeof input === 'object' && !Array.isArray(input)) {\r\n return Object.entries(input)\r\n .map(([k, v]) => {\r\n if (v === true) return k;\r\n // Si la llave raíz no está registrada, empezamos proceso con key vacía\r\n return process(registry[k] ? k : '', v);\r\n })\r\n .join(' ');\r\n }\r\n return input;\r\n });\r\n return twMerge(clsx(processed));\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["twMerge","clsx"],"mappings":"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","file":"index.cjs","sourcesContent":["import { twMerge } from 'tailwind-merge';\r\nimport clsx, { type ClassValue } from 'clsx';\r\n\r\n/**\r\n * Motor de prefijos con soporte para plugins, lógica transparente y limpieza via twMerge.\r\n */\r\nexport function createCl<TPlugins extends Record<string, string>[]>(...plugins: TPlugins) {\r\n const registry: Record<string, string> = Object.assign({}, ...plugins);\r\n\r\n const process = (key: string, value: any): string => {\r\n if (!value) return '';\r\n\r\n // 1. Manejo de Arrays\r\n if (Array.isArray(value)) {\r\n return value\r\n .map((v) => process(key, v))\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n // 2. Manejo de Objetos (Nesting y Lógica)\r\n if (typeof value === 'object') {\r\n return Object.entries(value)\r\n .map(([nestedKey, nestedValue]) => {\r\n const isRegistered = registry[nestedKey] !== undefined;\r\n\r\n let nextKey: string;\r\n if (key === '' || key === 'base') {\r\n // Si no hay prefijo previo, el hijo inicia la cadena\r\n nextKey = nestedKey;\r\n } else if (isRegistered) {\r\n // Si el hijo es un prefijo registrado, se concatena (ej: md:hover)\r\n nextKey = `${key}:${nestedKey}`;\r\n } else {\r\n // Si el hijo es lógica transparente (ej: variants), heredamos el prefijo padre\r\n nextKey = key;\r\n }\r\n\r\n return process(nextKey, nestedValue);\r\n })\r\n .join(' ');\r\n }\r\n\r\n // 3. Resolución Final de Prefijos\r\n const resolvedPrefix = key\r\n .split(':')\r\n .map((part) => {\r\n if (part === 'base') return null; // 'base' nunca se imprime\r\n return registry[part] || null; // Solo lo registrado sobrevive\r\n })\r\n .filter(Boolean)\r\n .join(':');\r\n\r\n // 4. Aplicación de Clases\r\n if (typeof value === 'string') {\r\n return value\r\n .split(/[,\\s\\n]+/)\r\n .filter(Boolean)\r\n .map((cls) => (!resolvedPrefix ? cls : `${resolvedPrefix}:${cls}`))\r\n .join(' ');\r\n }\r\n return '';\r\n };\r\n\r\n /**\r\n * Función resultante (tw)\r\n */\r\n return (...inputs: ClassValue[]) => {\r\n const processed = inputs.map((input) => {\r\n if (input !== null && typeof input === 'object' && !Array.isArray(input)) {\r\n return Object.entries(input)\r\n .map(([k, v]) => {\r\n // Soporte para booleanos nativos de clsx: { 'clase': true }\r\n if (v === true) return k;\r\n\r\n // Si la llave es un prefijo registrado (md, hover, ui), empezamos proceso\r\n if (registry[k] || k === 'base') return process(k, v);\r\n\r\n // Si no es prefijo (ej: variantes dinámicas), procesamos el interior como base\r\n return process('base', v);\r\n })\r\n .join(' ');\r\n }\r\n return input;\r\n });\r\n\r\n // Resolvemos con clsx y limpiamos conflictos con twMerge\r\n return twMerge(clsx(processed));\r\n };\r\n}\r\n"]}
package/dist/index.d.cts CHANGED
@@ -1,3 +1,8 @@
1
- declare function createCl<TPlugins extends Record<string, string>[]>(...plugins: TPlugins): (...inputs: any[]) => string;
1
+ import { ClassValue } from 'clsx';
2
+
3
+ /**
4
+ * Motor de prefijos con soporte para plugins, lógica transparente y limpieza via twMerge.
5
+ */
6
+ declare function createCl<TPlugins extends Record<string, string>[]>(...plugins: TPlugins): (...inputs: ClassValue[]) => string;
2
7
 
3
8
  export { createCl };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,8 @@
1
- declare function createCl<TPlugins extends Record<string, string>[]>(...plugins: TPlugins): (...inputs: any[]) => string;
1
+ import { ClassValue } from 'clsx';
2
+
3
+ /**
4
+ * Motor de prefijos con soporte para plugins, lógica transparente y limpieza via twMerge.
5
+ */
6
+ declare function createCl<TPlugins extends Record<string, string>[]>(...plugins: TPlugins): (...inputs: ClassValue[]) => string;
2
7
 
3
8
  export { createCl };
package/dist/index.js CHANGED
@@ -12,11 +12,21 @@ function createCl(...plugins) {
12
12
  if (typeof value === "object") {
13
13
  return Object.entries(value).map(([nestedKey, nestedValue]) => {
14
14
  const isRegistered = registry[nestedKey] !== void 0;
15
- const nextKey = isRegistered ? key ? `${key}:${nestedKey}` : nestedKey : key;
15
+ let nextKey;
16
+ if (key === "" || key === "base") {
17
+ nextKey = nestedKey;
18
+ } else if (isRegistered) {
19
+ nextKey = `${key}:${nestedKey}`;
20
+ } else {
21
+ nextKey = key;
22
+ }
16
23
  return process(nextKey, nestedValue);
17
24
  }).join(" ");
18
25
  }
19
- const resolvedPrefix = key.split(":").map((part) => registry[part] || null).filter(Boolean).join(":");
26
+ const resolvedPrefix = key.split(":").map((part) => {
27
+ if (part === "base") return null;
28
+ return registry[part] || null;
29
+ }).filter(Boolean).join(":");
20
30
  if (typeof value === "string") {
21
31
  return value.split(/[,\s\n]+/).filter(Boolean).map((cls) => !resolvedPrefix ? cls : `${resolvedPrefix}:${cls}`).join(" ");
22
32
  }
@@ -27,7 +37,8 @@ function createCl(...plugins) {
27
37
  if (input !== null && typeof input === "object" && !Array.isArray(input)) {
28
38
  return Object.entries(input).map(([k, v]) => {
29
39
  if (v === true) return k;
30
- return process(registry[k] ? k : "", v);
40
+ if (registry[k] || k === "base") return process(k, v);
41
+ return process("base", v);
31
42
  }).join(" ");
32
43
  }
33
44
  return input;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;AAGO,SAAS,YAAuD,OAAA,EAAmB;AACtF,EAAA,MAAM,WAAmC,MAAA,CAAO,MAAA,CAAO,EAAC,EAAG,GAAG,OAAO,CAAA;AAErE,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,EAAa,KAAA,KAAuB;AACjD,IAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtB,MAAA,OAAO,KAAA,CACF,GAAA,CAAI,CAAC,CAAA,KAAM,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAC,CAAA,CAC1B,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAAA,IACjB;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,MAAA,OAAO,MAAA,CAAO,QAAQ,KAAK,CAAA,CACtB,IAAI,CAAC,CAAC,SAAA,EAAW,WAAW,CAAA,KAAM;AAC/B,QAAA,MAAM,YAAA,GAAe,QAAA,CAAS,SAAS,CAAA,KAAM,MAAA;AAG7C,QAAA,MAAM,OAAA,GAAU,eAAgB,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,SAAS,KAAK,SAAA,GAAa,GAAA;AAE3E,QAAA,OAAO,OAAA,CAAQ,SAAS,WAAW,CAAA;AAAA,MACvC,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AAAA,IACjB;AAGA,IAAA,MAAM,iBAAiB,GAAA,CAClB,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAC,IAAA,KAAS,QAAA,CAAS,IAAI,KAAK,IAAI,CAAA,CACpC,OAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEb,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,MAAA,OAAO,KAAA,CACF,MAAM,UAAU,CAAA,CAChB,OAAO,OAAO,CAAA,CACd,IAAI,CAAC,GAAA,KAAS,CAAC,cAAA,GAAiB,GAAA,GAAM,GAAG,cAAc,CAAA,CAAA,EAAI,GAAG,CAAA,CAAG,CAAA,CACjE,KAAK,GAAG,CAAA;AAAA,IACjB;AACA,IAAA,OAAO,EAAA;AAAA,EACX,CAAA;AAEA,EAAA,OAAO,IAAI,MAAA,KAAkB;AACzB,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACpC,MAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtE,QAAA,OAAO,MAAA,CAAO,QAAQ,KAAK,CAAA,CACtB,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AACb,UAAA,IAAI,CAAA,KAAM,MAAM,OAAO,CAAA;AAEvB,UAAA,OAAO,QAAQ,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,QAC1C,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AAAA,MACjB;AACA,MAAA,OAAO,KAAA;AAAA,IACX,CAAC,CAAA;AACD,IAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,EAClC,CAAA;AACJ","file":"index.js","sourcesContent":["import { twMerge } from 'tailwind-merge';\r\nimport clsx from 'clsx';\r\n\r\nexport function createCl<TPlugins extends Record<string, string>[]>(...plugins: TPlugins) {\r\n const registry: Record<string, string> = Object.assign({}, ...plugins);\r\n\r\n const process = (key: string, value: any): string => {\r\n if (!value) return '';\r\n\r\n if (Array.isArray(value)) {\r\n return value\r\n .map((v) => process(key, v))\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n if (typeof value === 'object') {\r\n return Object.entries(value)\r\n .map(([nestedKey, nestedValue]) => {\r\n const isRegistered = registry[nestedKey] !== undefined;\r\n // Si el hijo está registrado, añadimos al prefijo.\r\n // Si no, mantenemos el prefijo actual (transparencia).\r\n const nextKey = isRegistered ? (key ? `${key}:${nestedKey}` : nestedKey) : key;\r\n\r\n return process(nextKey, nestedValue);\r\n })\r\n .join(' ');\r\n }\r\n\r\n // RESOLUCIÓN: Solo lo que esté en el registro se convierte en prefijo.\r\n const resolvedPrefix = key\r\n .split(':')\r\n .map((part) => registry[part] || null)\r\n .filter(Boolean)\r\n .join(':');\r\n\r\n if (typeof value === 'string') {\r\n return value\r\n .split(/[,\\s\\n]+/)\r\n .filter(Boolean)\r\n .map((cls) => (!resolvedPrefix ? cls : `${resolvedPrefix}:${cls}`))\r\n .join(' ');\r\n }\r\n return '';\r\n };\r\n\r\n return (...inputs: any[]) => {\r\n const processed = inputs.map((input) => {\r\n if (input !== null && typeof input === 'object' && !Array.isArray(input)) {\r\n return Object.entries(input)\r\n .map(([k, v]) => {\r\n if (v === true) return k;\r\n // Si la llave raíz no está registrada, empezamos proceso con key vacía\r\n return process(registry[k] ? k : '', v);\r\n })\r\n .join(' ');\r\n }\r\n return input;\r\n });\r\n return twMerge(clsx(processed));\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { twMerge } from 'tailwind-merge';\r\nimport clsx, { type ClassValue } from 'clsx';\r\n\r\n/**\r\n * Motor de prefijos con soporte para plugins, lógica transparente y limpieza via twMerge.\r\n */\r\nexport function createCl<TPlugins extends Record<string, string>[]>(...plugins: TPlugins) {\r\n const registry: Record<string, string> = Object.assign({}, ...plugins);\r\n\r\n const process = (key: string, value: any): string => {\r\n if (!value) return '';\r\n\r\n // 1. Manejo de Arrays\r\n if (Array.isArray(value)) {\r\n return value\r\n .map((v) => process(key, v))\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n // 2. Manejo de Objetos (Nesting y Lógica)\r\n if (typeof value === 'object') {\r\n return Object.entries(value)\r\n .map(([nestedKey, nestedValue]) => {\r\n const isRegistered = registry[nestedKey] !== undefined;\r\n\r\n let nextKey: string;\r\n if (key === '' || key === 'base') {\r\n // Si no hay prefijo previo, el hijo inicia la cadena\r\n nextKey = nestedKey;\r\n } else if (isRegistered) {\r\n // Si el hijo es un prefijo registrado, se concatena (ej: md:hover)\r\n nextKey = `${key}:${nestedKey}`;\r\n } else {\r\n // Si el hijo es lógica transparente (ej: variants), heredamos el prefijo padre\r\n nextKey = key;\r\n }\r\n\r\n return process(nextKey, nestedValue);\r\n })\r\n .join(' ');\r\n }\r\n\r\n // 3. Resolución Final de Prefijos\r\n const resolvedPrefix = key\r\n .split(':')\r\n .map((part) => {\r\n if (part === 'base') return null; // 'base' nunca se imprime\r\n return registry[part] || null; // Solo lo registrado sobrevive\r\n })\r\n .filter(Boolean)\r\n .join(':');\r\n\r\n // 4. Aplicación de Clases\r\n if (typeof value === 'string') {\r\n return value\r\n .split(/[,\\s\\n]+/)\r\n .filter(Boolean)\r\n .map((cls) => (!resolvedPrefix ? cls : `${resolvedPrefix}:${cls}`))\r\n .join(' ');\r\n }\r\n return '';\r\n };\r\n\r\n /**\r\n * Función resultante (tw)\r\n */\r\n return (...inputs: ClassValue[]) => {\r\n const processed = inputs.map((input) => {\r\n if (input !== null && typeof input === 'object' && !Array.isArray(input)) {\r\n return Object.entries(input)\r\n .map(([k, v]) => {\r\n // Soporte para booleanos nativos de clsx: { 'clase': true }\r\n if (v === true) return k;\r\n\r\n // Si la llave es un prefijo registrado (md, hover, ui), empezamos proceso\r\n if (registry[k] || k === 'base') return process(k, v);\r\n\r\n // Si no es prefijo (ej: variantes dinámicas), procesamos el interior como base\r\n return process('base', v);\r\n })\r\n .join(' ');\r\n }\r\n return input;\r\n });\r\n\r\n // Resolvemos con clsx y limpiamos conflictos con twMerge\r\n return twMerge(clsx(processed));\r\n };\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clases",
3
- "version": "1.1.4",
3
+ "version": "1.1.5",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
package/src/index.ts CHANGED
@@ -1,12 +1,16 @@
1
1
  import { twMerge } from 'tailwind-merge';
2
- import clsx from 'clsx';
2
+ import clsx, { type ClassValue } from 'clsx';
3
3
 
4
+ /**
5
+ * Motor de prefijos con soporte para plugins, lógica transparente y limpieza via twMerge.
6
+ */
4
7
  export function createCl<TPlugins extends Record<string, string>[]>(...plugins: TPlugins) {
5
8
  const registry: Record<string, string> = Object.assign({}, ...plugins);
6
9
 
7
10
  const process = (key: string, value: any): string => {
8
11
  if (!value) return '';
9
12
 
13
+ // 1. Manejo de Arrays
10
14
  if (Array.isArray(value)) {
11
15
  return value
12
16
  .map((v) => process(key, v))
@@ -14,26 +18,40 @@ export function createCl<TPlugins extends Record<string, string>[]>(...plugins:
14
18
  .join(' ');
15
19
  }
16
20
 
21
+ // 2. Manejo de Objetos (Nesting y Lógica)
17
22
  if (typeof value === 'object') {
18
23
  return Object.entries(value)
19
24
  .map(([nestedKey, nestedValue]) => {
20
25
  const isRegistered = registry[nestedKey] !== undefined;
21
- // Si el hijo está registrado, añadimos al prefijo.
22
- // Si no, mantenemos el prefijo actual (transparencia).
23
- const nextKey = isRegistered ? (key ? `${key}:${nestedKey}` : nestedKey) : key;
26
+
27
+ let nextKey: string;
28
+ if (key === '' || key === 'base') {
29
+ // Si no hay prefijo previo, el hijo inicia la cadena
30
+ nextKey = nestedKey;
31
+ } else if (isRegistered) {
32
+ // Si el hijo es un prefijo registrado, se concatena (ej: md:hover)
33
+ nextKey = `${key}:${nestedKey}`;
34
+ } else {
35
+ // Si el hijo es lógica transparente (ej: variants), heredamos el prefijo padre
36
+ nextKey = key;
37
+ }
24
38
 
25
39
  return process(nextKey, nestedValue);
26
40
  })
27
41
  .join(' ');
28
42
  }
29
43
 
30
- // RESOLUCIÓN: Solo lo que esté en el registro se convierte en prefijo.
44
+ // 3. Resolución Final de Prefijos
31
45
  const resolvedPrefix = key
32
46
  .split(':')
33
- .map((part) => registry[part] || null)
47
+ .map((part) => {
48
+ if (part === 'base') return null; // 'base' nunca se imprime
49
+ return registry[part] || null; // Solo lo registrado sobrevive
50
+ })
34
51
  .filter(Boolean)
35
52
  .join(':');
36
53
 
54
+ // 4. Aplicación de Clases
37
55
  if (typeof value === 'string') {
38
56
  return value
39
57
  .split(/[,\s\n]+/)
@@ -44,19 +62,29 @@ export function createCl<TPlugins extends Record<string, string>[]>(...plugins:
44
62
  return '';
45
63
  };
46
64
 
47
- return (...inputs: any[]) => {
65
+ /**
66
+ * Función resultante (tw)
67
+ */
68
+ return (...inputs: ClassValue[]) => {
48
69
  const processed = inputs.map((input) => {
49
70
  if (input !== null && typeof input === 'object' && !Array.isArray(input)) {
50
71
  return Object.entries(input)
51
72
  .map(([k, v]) => {
73
+ // Soporte para booleanos nativos de clsx: { 'clase': true }
52
74
  if (v === true) return k;
53
- // Si la llave raíz no está registrada, empezamos proceso con key vacía
54
- return process(registry[k] ? k : '', v);
75
+
76
+ // Si la llave es un prefijo registrado (md, hover, ui), empezamos proceso
77
+ if (registry[k] || k === 'base') return process(k, v);
78
+
79
+ // Si no es prefijo (ej: variantes dinámicas), procesamos el interior como base
80
+ return process('base', v);
55
81
  })
56
82
  .join(' ');
57
83
  }
58
84
  return input;
59
85
  });
86
+
87
+ // Resolvemos con clsx y limpiamos conflictos con twMerge
60
88
  return twMerge(clsx(processed));
61
89
  };
62
90
  }