tailwind-merge 1.1.1 → 1.2.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.
- package/README.md +7 -3
- package/dist/lib/class-utils.mjs +31 -2
- package/dist/lib/class-utils.mjs.map +1 -1
- package/dist/lib/merge-classlist.mjs +11 -11
- package/dist/lib/merge-classlist.mjs.map +1 -1
- package/dist/lib/types.d.ts +5 -0
- package/dist/tailwind-merge.cjs.development.js +42 -13
- package/dist/tailwind-merge.cjs.development.js.map +1 -1
- package/dist/tailwind-merge.cjs.production.min.js +1 -1
- package/dist/tailwind-merge.cjs.production.min.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/class-utils.ts +34 -2
- package/src/lib/merge-classlist.ts +16 -14
- package/src/lib/types.ts +5 -0
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<br />
|
|
3
3
|
<a href="https://github.com/dcastil/tailwind-merge">
|
|
4
|
-
<!-- AUTOGENERATED START logo-image --><img src="https://github.com/dcastil/tailwind-merge/raw/v1.
|
|
4
|
+
<!-- AUTOGENERATED START logo-image --><img src="https://github.com/dcastil/tailwind-merge/raw/v1.2.0/assets/logo.svg" alt="tailwind-merge" width="221px" /><!-- AUTOGENERATED END -->
|
|
5
5
|
</a>
|
|
6
6
|
</div>
|
|
7
7
|
|
|
@@ -55,7 +55,7 @@ function MyGenericInput(props) {
|
|
|
55
55
|
}
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
-
tailwind-merge
|
|
58
|
+
tailwind-merge overrides conflicting classes and keeps everything else untouched. In the case of the `MySlightlyModifiedInput`, the input now only renders the classes `border rounded p-3`.
|
|
59
59
|
|
|
60
60
|
## Features
|
|
61
61
|
|
|
@@ -86,7 +86,7 @@ twMerge('bottom-auto inset-y-6') // → 'inset-y-6'
|
|
|
86
86
|
twMerge('inline block') // → 'block'
|
|
87
87
|
```
|
|
88
88
|
|
|
89
|
-
### Supports
|
|
89
|
+
### Supports modifiers and stacked modifiers
|
|
90
90
|
|
|
91
91
|
```ts
|
|
92
92
|
twMerge('p-2 hover:p-4') // → 'p-2 hover:p-4'
|
|
@@ -166,8 +166,11 @@ The tailwind-merge config is an object with a few keys.
|
|
|
166
166
|
const tailwindMergeConfig = {
|
|
167
167
|
// ↓ Set how many values should be stored in cache.
|
|
168
168
|
cacheSize: 500,
|
|
169
|
+
// ↓ Optional prefix from TaiLwind config
|
|
170
|
+
prefix: 'tw-',
|
|
169
171
|
theme: {
|
|
170
172
|
// Theme scales are defined here
|
|
173
|
+
// This is not the theme object from your Tailwind config
|
|
171
174
|
},
|
|
172
175
|
classGroups: {
|
|
173
176
|
// Class groups are defined here
|
|
@@ -308,6 +311,7 @@ The function takes a callback which returns the config you want to use and retur
|
|
|
308
311
|
import { createTailwindMerge } from 'tailwind-merge'
|
|
309
312
|
|
|
310
313
|
const customTwMerge = createTailwindMerge(() => ({
|
|
314
|
+
cacheSize: 500,
|
|
311
315
|
theme: {},
|
|
312
316
|
classGroups: {
|
|
313
317
|
foo: ['foo', 'foo-2', { 'bar-baz': ['', '1', '2'] }],
|
package/dist/lib/class-utils.mjs
CHANGED
|
@@ -67,12 +67,14 @@ function getGroupIdForArbitraryProperty(className) {
|
|
|
67
67
|
|
|
68
68
|
|
|
69
69
|
function createClassMap(config) {
|
|
70
|
-
var theme = config.theme
|
|
70
|
+
var theme = config.theme,
|
|
71
|
+
prefix = config.prefix;
|
|
71
72
|
var classMap = {
|
|
72
73
|
nextPart: {},
|
|
73
74
|
validators: []
|
|
74
75
|
};
|
|
75
|
-
Object.entries(config.classGroups)
|
|
76
|
+
var prefixedClassGroupEntries = getPrefixedClassGroupEntries(Object.entries(config.classGroups), prefix);
|
|
77
|
+
prefixedClassGroupEntries.forEach(function (_ref2) {
|
|
76
78
|
var classGroupId = _ref2[0],
|
|
77
79
|
classGroup = _ref2[1];
|
|
78
80
|
processClassesRecursively(classGroup, classMap, classGroupId, theme);
|
|
@@ -128,5 +130,32 @@ function isThemeGetter(func) {
|
|
|
128
130
|
return func.isThemeGetter;
|
|
129
131
|
}
|
|
130
132
|
|
|
133
|
+
function getPrefixedClassGroupEntries(classGroupEntries, prefix) {
|
|
134
|
+
if (!prefix) {
|
|
135
|
+
return classGroupEntries;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return classGroupEntries.map(function (_ref4) {
|
|
139
|
+
var classGroupId = _ref4[0],
|
|
140
|
+
classGroup = _ref4[1];
|
|
141
|
+
var prefixedClassGroup = classGroup.map(function (classDefinition) {
|
|
142
|
+
if (typeof classDefinition === 'string') {
|
|
143
|
+
return prefix + classDefinition;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (typeof classDefinition === 'object') {
|
|
147
|
+
return Object.fromEntries(Object.entries(classDefinition).map(function (_ref5) {
|
|
148
|
+
var key = _ref5[0],
|
|
149
|
+
value = _ref5[1];
|
|
150
|
+
return [prefix + key, value];
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return classDefinition;
|
|
155
|
+
});
|
|
156
|
+
return [classGroupId, prefixedClassGroup];
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
131
160
|
export { createClassMap, createClassUtils };
|
|
132
161
|
//# sourceMappingURL=class-utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"class-utils.mjs","sources":["../../src/lib/class-utils.ts"],"sourcesContent":["import { ClassGroupId, Config, ClassGroup, ClassValidator, ThemeObject, ThemeGetter } from './types'\n\nexport interface ClassPartObject {\n nextPart: Record<string, ClassPartObject>\n validators: ClassValidatorObject[]\n classGroupId?: ClassGroupId\n}\n\ninterface ClassValidatorObject {\n classGroupId: ClassGroupId\n validator: ClassValidator\n}\n\nconst CLASS_PART_SEPARATOR = '-'\n\nexport function createClassUtils(config: Config) {\n const classMap = createClassMap(config)\n\n function getClassGroupId(className: string) {\n const classParts = className.split(CLASS_PART_SEPARATOR)\n\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift()\n }\n\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className)\n }\n\n function getConflictingClassGroupIds(classGroupId: ClassGroupId) {\n return config.conflictingClassGroups[classGroupId] || []\n }\n\n return {\n getClassGroupId,\n getConflictingClassGroupIds,\n }\n}\n\nfunction getGroupRecursive(\n classParts: string[],\n classPartObject: ClassPartObject\n): ClassGroupId | undefined {\n if (classParts.length === 0) {\n return classPartObject.classGroupId\n }\n\n const currentClassPart = classParts[0]!\n const nextClassPartObject = classPartObject.nextPart[currentClassPart]\n const classGroupFromNextClassPart = nextClassPartObject\n ? getGroupRecursive(classParts.slice(1), nextClassPartObject)\n : undefined\n\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart\n }\n\n if (classPartObject.validators.length === 0) {\n return undefined\n }\n\n const classRest = classParts.join(CLASS_PART_SEPARATOR)\n\n return classPartObject.validators.find(({ validator }) => validator(classRest))?.classGroupId\n}\n\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/\n\nfunction getGroupIdForArbitraryProperty(className: string) {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)![1]\n const property = arbitraryPropertyClassName?.substring(\n 0,\n arbitraryPropertyClassName.indexOf(':')\n )\n\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property\n }\n }\n}\n\n/**\n * Exported for testing only\n */\nexport function createClassMap(config: Config) {\n const { theme } = config\n const classMap: ClassPartObject = {\n nextPart: {},\n validators: [],\n }\n\n Object.entries(config.classGroups).forEach(([classGroupId, classGroup]) => {\n processClassesRecursively(classGroup, classMap, classGroupId, theme)\n })\n\n return classMap\n}\n\nfunction processClassesRecursively(\n classGroup: ClassGroup,\n classPartObject: ClassPartObject,\n classGroupId: ClassGroupId,\n theme: ThemeObject\n) {\n classGroup.forEach((classDefinition) => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit =\n classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition)\n classPartObjectToEdit.classGroupId = classGroupId\n return\n }\n\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(\n classDefinition(theme),\n classPartObject,\n classGroupId,\n theme\n )\n return\n }\n\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId,\n })\n\n return\n }\n\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(\n classGroup,\n getPart(classPartObject, key),\n classGroupId,\n theme\n )\n })\n })\n}\n\nfunction getPart(classPartObject: ClassPartObject, path: string) {\n let currentClassPartObject = classPartObject\n\n path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => {\n if (currentClassPartObject.nextPart[pathPart] === undefined) {\n currentClassPartObject.nextPart[pathPart] = {\n nextPart: {},\n validators: [],\n }\n }\n\n currentClassPartObject = currentClassPartObject.nextPart[pathPart]!\n })\n\n return currentClassPartObject\n}\n\nfunction isThemeGetter(func: ClassValidator | ThemeGetter): func is ThemeGetter {\n return (func as ThemeGetter).isThemeGetter\n}\n"],"names":["CLASS_PART_SEPARATOR","createClassUtils","config","classMap","createClassMap","getClassGroupId","className","classParts","split","length","shift","getGroupRecursive","getGroupIdForArbitraryProperty","getConflictingClassGroupIds","classGroupId","conflictingClassGroups","classPartObject","currentClassPart","nextClassPartObject","nextPart","classGroupFromNextClassPart","slice","undefined","validators","classRest","join","find","validator","arbitraryPropertyRegex","test","arbitraryPropertyClassName","exec","property","substring","indexOf","theme","Object","entries","classGroups","forEach","classGroup","processClassesRecursively","classDefinition","classPartObjectToEdit","getPart","isThemeGetter","push","key","path","currentClassPartObject","pathPart","func"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"class-utils.mjs","sources":["../../src/lib/class-utils.ts"],"sourcesContent":["import { ClassGroupId, Config, ClassGroup, ClassValidator, ThemeObject, ThemeGetter } from './types'\n\nexport interface ClassPartObject {\n nextPart: Record<string, ClassPartObject>\n validators: ClassValidatorObject[]\n classGroupId?: ClassGroupId\n}\n\ninterface ClassValidatorObject {\n classGroupId: ClassGroupId\n validator: ClassValidator\n}\n\nconst CLASS_PART_SEPARATOR = '-'\n\nexport function createClassUtils(config: Config) {\n const classMap = createClassMap(config)\n\n function getClassGroupId(className: string) {\n const classParts = className.split(CLASS_PART_SEPARATOR)\n\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift()\n }\n\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className)\n }\n\n function getConflictingClassGroupIds(classGroupId: ClassGroupId) {\n return config.conflictingClassGroups[classGroupId] || []\n }\n\n return {\n getClassGroupId,\n getConflictingClassGroupIds,\n }\n}\n\nfunction getGroupRecursive(\n classParts: string[],\n classPartObject: ClassPartObject\n): ClassGroupId | undefined {\n if (classParts.length === 0) {\n return classPartObject.classGroupId\n }\n\n const currentClassPart = classParts[0]!\n const nextClassPartObject = classPartObject.nextPart[currentClassPart]\n const classGroupFromNextClassPart = nextClassPartObject\n ? getGroupRecursive(classParts.slice(1), nextClassPartObject)\n : undefined\n\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart\n }\n\n if (classPartObject.validators.length === 0) {\n return undefined\n }\n\n const classRest = classParts.join(CLASS_PART_SEPARATOR)\n\n return classPartObject.validators.find(({ validator }) => validator(classRest))?.classGroupId\n}\n\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/\n\nfunction getGroupIdForArbitraryProperty(className: string) {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)![1]\n const property = arbitraryPropertyClassName?.substring(\n 0,\n arbitraryPropertyClassName.indexOf(':')\n )\n\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property\n }\n }\n}\n\n/**\n * Exported for testing only\n */\nexport function createClassMap(config: Config) {\n const { theme, prefix } = config\n const classMap: ClassPartObject = {\n nextPart: {},\n validators: [],\n }\n\n const prefixedClassGroupEntries = getPrefixedClassGroupEntries(\n Object.entries(config.classGroups),\n prefix\n )\n\n prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {\n processClassesRecursively(classGroup, classMap, classGroupId, theme)\n })\n\n return classMap\n}\n\nfunction processClassesRecursively(\n classGroup: ClassGroup,\n classPartObject: ClassPartObject,\n classGroupId: ClassGroupId,\n theme: ThemeObject\n) {\n classGroup.forEach((classDefinition) => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit =\n classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition)\n classPartObjectToEdit.classGroupId = classGroupId\n return\n }\n\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(\n classDefinition(theme),\n classPartObject,\n classGroupId,\n theme\n )\n return\n }\n\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId,\n })\n\n return\n }\n\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(\n classGroup,\n getPart(classPartObject, key),\n classGroupId,\n theme\n )\n })\n })\n}\n\nfunction getPart(classPartObject: ClassPartObject, path: string) {\n let currentClassPartObject = classPartObject\n\n path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => {\n if (currentClassPartObject.nextPart[pathPart] === undefined) {\n currentClassPartObject.nextPart[pathPart] = {\n nextPart: {},\n validators: [],\n }\n }\n\n currentClassPartObject = currentClassPartObject.nextPart[pathPart]!\n })\n\n return currentClassPartObject\n}\n\nfunction isThemeGetter(func: ClassValidator | ThemeGetter): func is ThemeGetter {\n return (func as ThemeGetter).isThemeGetter\n}\n\nfunction getPrefixedClassGroupEntries(\n classGroupEntries: Array<[classGroupId: string, classGroup: ClassGroup]>,\n prefix: string | undefined\n): Array<[classGroupId: string, classGroup: ClassGroup]> {\n if (!prefix) {\n return classGroupEntries\n }\n\n return classGroupEntries.map(([classGroupId, classGroup]) => {\n const prefixedClassGroup = classGroup.map((classDefinition) => {\n if (typeof classDefinition === 'string') {\n return prefix + classDefinition\n }\n\n if (typeof classDefinition === 'object') {\n return Object.fromEntries(\n Object.entries(classDefinition).map(([key, value]) => [prefix + key, value])\n )\n }\n\n return classDefinition\n })\n\n return [classGroupId, prefixedClassGroup]\n })\n}\n"],"names":["CLASS_PART_SEPARATOR","createClassUtils","config","classMap","createClassMap","getClassGroupId","className","classParts","split","length","shift","getGroupRecursive","getGroupIdForArbitraryProperty","getConflictingClassGroupIds","classGroupId","conflictingClassGroups","classPartObject","currentClassPart","nextClassPartObject","nextPart","classGroupFromNextClassPart","slice","undefined","validators","classRest","join","find","validator","arbitraryPropertyRegex","test","arbitraryPropertyClassName","exec","property","substring","indexOf","theme","prefix","prefixedClassGroupEntries","getPrefixedClassGroupEntries","Object","entries","classGroups","forEach","classGroup","processClassesRecursively","classDefinition","classPartObjectToEdit","getPart","isThemeGetter","push","key","path","currentClassPartObject","pathPart","func","classGroupEntries","map","prefixedClassGroup","fromEntries","value"],"mappings":"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"}
|
|
@@ -2,14 +2,14 @@ var SPLIT_CLASSES_REGEX = /\s+/;
|
|
|
2
2
|
var IMPORTANT_MODIFIER = '!'; // Regex is needed so we don't match against colons in labels for arbitrary values like `text-[color:var(--mystery-var)]`
|
|
3
3
|
// I'd prefer to use a negative lookbehind for all supported labels, but lookbheinds don't have good browser support yet. More info: https://caniuse.com/js-regexp-lookbehind
|
|
4
4
|
|
|
5
|
-
var
|
|
6
|
-
var
|
|
5
|
+
var MODIFIER_SEPARATOR_REGEX = /:(?![^[]*\])/;
|
|
6
|
+
var MODIFIER_SEPARATOR = ':';
|
|
7
7
|
function mergeClassList(classList, configUtils) {
|
|
8
8
|
var getClassGroupId = configUtils.getClassGroupId,
|
|
9
9
|
getConflictingClassGroupIds = configUtils.getConflictingClassGroupIds;
|
|
10
10
|
/**
|
|
11
11
|
* Set of classGroupIds in following format:
|
|
12
|
-
* `{importantModifier}{
|
|
12
|
+
* `{importantModifier}{variantModifiers}{classGroupId}`
|
|
13
13
|
* @example 'float'
|
|
14
14
|
* @example 'hover:focus:bg-color'
|
|
15
15
|
* @example '!md:pr'
|
|
@@ -17,8 +17,8 @@ function mergeClassList(classList, configUtils) {
|
|
|
17
17
|
|
|
18
18
|
var classGroupsInConflict = new Set();
|
|
19
19
|
return classList.trim().split(SPLIT_CLASSES_REGEX).map(function (originalClassName) {
|
|
20
|
-
var
|
|
21
|
-
var classNameWithImportantModifier =
|
|
20
|
+
var modifiers = originalClassName.split(MODIFIER_SEPARATOR_REGEX);
|
|
21
|
+
var classNameWithImportantModifier = modifiers.pop();
|
|
22
22
|
var hasImportantModifier = classNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER);
|
|
23
23
|
var className = hasImportantModifier ? classNameWithImportantModifier.substring(1) : classNameWithImportantModifier;
|
|
24
24
|
var classGroupId = getClassGroupId(className);
|
|
@@ -30,11 +30,11 @@ function mergeClassList(classList, configUtils) {
|
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
var
|
|
34
|
-
var
|
|
33
|
+
var variantModifier = modifiers.length === 0 ? '' : modifiers.sort().concat('').join(MODIFIER_SEPARATOR);
|
|
34
|
+
var fullModifier = hasImportantModifier ? IMPORTANT_MODIFIER + variantModifier : variantModifier;
|
|
35
35
|
return {
|
|
36
36
|
isTailwindClass: true,
|
|
37
|
-
|
|
37
|
+
modifier: fullModifier,
|
|
38
38
|
classGroupId: classGroupId,
|
|
39
39
|
originalClassName: originalClassName
|
|
40
40
|
};
|
|
@@ -44,9 +44,9 @@ function mergeClassList(classList, configUtils) {
|
|
|
44
44
|
return true;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
var
|
|
47
|
+
var modifier = parsed.modifier,
|
|
48
48
|
classGroupId = parsed.classGroupId;
|
|
49
|
-
var classId =
|
|
49
|
+
var classId = modifier + ":" + classGroupId;
|
|
50
50
|
|
|
51
51
|
if (classGroupsInConflict.has(classId)) {
|
|
52
52
|
return false;
|
|
@@ -54,7 +54,7 @@ function mergeClassList(classList, configUtils) {
|
|
|
54
54
|
|
|
55
55
|
classGroupsInConflict.add(classId);
|
|
56
56
|
getConflictingClassGroupIds(classGroupId).forEach(function (group) {
|
|
57
|
-
return classGroupsInConflict.add(
|
|
57
|
+
return classGroupsInConflict.add(modifier + ":" + group);
|
|
58
58
|
});
|
|
59
59
|
return true;
|
|
60
60
|
}).reverse().map(function (parsed) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-classlist.mjs","sources":["../../src/lib/merge-classlist.ts"],"sourcesContent":["import { ConfigUtils } from './config-utils'\n\nconst SPLIT_CLASSES_REGEX = /\\s+/\nconst IMPORTANT_MODIFIER = '!'\n// Regex is needed so we don't match against colons in labels for arbitrary values like `text-[color:var(--mystery-var)]`\n// I'd prefer to use a negative lookbehind for all supported labels, but lookbheinds don't have good browser support yet. More info: https://caniuse.com/js-regexp-lookbehind\nconst
|
|
1
|
+
{"version":3,"file":"merge-classlist.mjs","sources":["../../src/lib/merge-classlist.ts"],"sourcesContent":["import { ConfigUtils } from './config-utils'\n\nconst SPLIT_CLASSES_REGEX = /\\s+/\nconst IMPORTANT_MODIFIER = '!'\n// Regex is needed so we don't match against colons in labels for arbitrary values like `text-[color:var(--mystery-var)]`\n// I'd prefer to use a negative lookbehind for all supported labels, but lookbheinds don't have good browser support yet. More info: https://caniuse.com/js-regexp-lookbehind\nconst MODIFIER_SEPARATOR_REGEX = /:(?![^[]*\\])/\nconst MODIFIER_SEPARATOR = ':'\n\nexport function mergeClassList(classList: string, configUtils: ConfigUtils) {\n const { getClassGroupId, getConflictingClassGroupIds } = configUtils\n\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example '!md:pr'\n */\n const classGroupsInConflict = new Set<string>()\n\n return (\n classList\n .trim()\n .split(SPLIT_CLASSES_REGEX)\n .map((originalClassName) => {\n const modifiers = originalClassName.split(MODIFIER_SEPARATOR_REGEX)\n const classNameWithImportantModifier = modifiers.pop()!\n\n const hasImportantModifier =\n classNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)\n const className = hasImportantModifier\n ? classNameWithImportantModifier.substring(1)\n : classNameWithImportantModifier\n\n const classGroupId = getClassGroupId(className)\n\n if (!classGroupId) {\n return {\n isTailwindClass: false as const,\n originalClassName,\n }\n }\n\n const variantModifier =\n modifiers.length === 0\n ? ''\n : modifiers.sort().concat('').join(MODIFIER_SEPARATOR)\n\n const fullModifier = hasImportantModifier\n ? IMPORTANT_MODIFIER + variantModifier\n : variantModifier\n\n return {\n isTailwindClass: true as const,\n modifier: fullModifier,\n classGroupId,\n originalClassName,\n }\n })\n .reverse()\n // Last class in conflict wins, so we need to filter conflicting classes in reverse order.\n .filter((parsed) => {\n if (!parsed.isTailwindClass) {\n return true\n }\n\n const { modifier, classGroupId } = parsed\n\n const classId = `${modifier}:${classGroupId}`\n\n if (classGroupsInConflict.has(classId)) {\n return false\n }\n\n classGroupsInConflict.add(classId)\n\n getConflictingClassGroupIds(classGroupId).forEach((group) =>\n classGroupsInConflict.add(`${modifier}:${group}`)\n )\n\n return true\n })\n .reverse()\n .map((parsed) => parsed.originalClassName)\n .join(' ')\n )\n}\n"],"names":["SPLIT_CLASSES_REGEX","IMPORTANT_MODIFIER","MODIFIER_SEPARATOR_REGEX","MODIFIER_SEPARATOR","mergeClassList","classList","configUtils","getClassGroupId","getConflictingClassGroupIds","classGroupsInConflict","Set","trim","split","map","originalClassName","modifiers","classNameWithImportantModifier","pop","hasImportantModifier","startsWith","className","substring","classGroupId","isTailwindClass","variantModifier","length","sort","concat","join","fullModifier","modifier","reverse","filter","parsed","classId","has","add","forEach","group"],"mappings":"AAEA,IAAMA,mBAAmB,GAAG,KAA5B;AACA,IAAMC,kBAAkB,GAAG,GAA3B;AAEA;;AACA,IAAMC,wBAAwB,GAAG,cAAjC;AACA,IAAMC,kBAAkB,GAAG,GAA3B;SAEgBC,eAAeC,WAAmBC;AAC9C,MAAQC,eAAR,GAAyDD,WAAzD,CAAQC,eAAR;AAAA,MAAyBC,2BAAzB,GAAyDF,WAAzD,CAAyBE,2BAAzB;AAEA;;;;;;;;AAOA,MAAMC,qBAAqB,GAAG,IAAIC,GAAJ,EAA9B;AAEA,SACIL,SAAS,CACJM,IADL,GAEKC,KAFL,CAEWZ,mBAFX,EAGKa,GAHL,CAGS,UAACC,iBAAD;AACD,QAAMC,SAAS,GAAGD,iBAAiB,CAACF,KAAlB,CAAwBV,wBAAxB,CAAlB;AACA,QAAMc,8BAA8B,GAAGD,SAAS,CAACE,GAAV,EAAvC;AAEA,QAAMC,oBAAoB,GACtBF,8BAA8B,CAACG,UAA/B,CAA0ClB,kBAA1C,CADJ;AAEA,QAAMmB,SAAS,GAAGF,oBAAoB,GAChCF,8BAA8B,CAACK,SAA/B,CAAyC,CAAzC,CADgC,GAEhCL,8BAFN;AAIA,QAAMM,YAAY,GAAGf,eAAe,CAACa,SAAD,CAApC;;AAEA,QAAI,CAACE,YAAL,EAAmB;AACf,aAAO;AACHC,QAAAA,eAAe,EAAE,KADd;AAEHT,QAAAA,iBAAiB,EAAjBA;AAFG,OAAP;AAIH;;AAED,QAAMU,eAAe,GACjBT,SAAS,CAACU,MAAV,KAAqB,CAArB,GACM,EADN,GAEMV,SAAS,CAACW,IAAV,GAAiBC,MAAjB,CAAwB,EAAxB,EAA4BC,IAA5B,CAAiCzB,kBAAjC,CAHV;AAKA,QAAM0B,YAAY,GAAGX,oBAAoB,GACnCjB,kBAAkB,GAAGuB,eADc,GAEnCA,eAFN;AAIA,WAAO;AACHD,MAAAA,eAAe,EAAE,IADd;AAEHO,MAAAA,QAAQ,EAAED,YAFP;AAGHP,MAAAA,YAAY,EAAZA,YAHG;AAIHR,MAAAA,iBAAiB,EAAjBA;AAJG,KAAP;AAMH,GArCL,EAsCKiB,OAtCL;AAAA,GAwCKC,MAxCL,CAwCY,UAACC,MAAD;AACJ,QAAI,CAACA,MAAM,CAACV,eAAZ,EAA6B;AACzB,aAAO,IAAP;AACH;;AAED,QAAQO,QAAR,GAAmCG,MAAnC,CAAQH,QAAR;AAAA,QAAkBR,YAAlB,GAAmCW,MAAnC,CAAkBX,YAAlB;AAEA,QAAMY,OAAO,GAAMJ,QAAN,SAAkBR,YAA/B;;AAEA,QAAIb,qBAAqB,CAAC0B,GAAtB,CAA0BD,OAA1B,CAAJ,EAAwC;AACpC,aAAO,KAAP;AACH;;AAEDzB,IAAAA,qBAAqB,CAAC2B,GAAtB,CAA0BF,OAA1B;AAEA1B,IAAAA,2BAA2B,CAACc,YAAD,CAA3B,CAA0Ce,OAA1C,CAAkD,UAACC,KAAD;AAAA,aAC9C7B,qBAAqB,CAAC2B,GAAtB,CAA6BN,QAA7B,SAAyCQ,KAAzC,CAD8C;AAAA,KAAlD;AAIA,WAAO,IAAP;AACH,GA5DL,EA6DKP,OA7DL,GA8DKlB,GA9DL,CA8DS,UAACoB,MAAD;AAAA,WAAYA,MAAM,CAACnB,iBAAnB;AAAA,GA9DT,EA+DKc,IA/DL,CA+DU,GA/DV,CADJ;AAkEH;;;;"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -5,6 +5,11 @@ export interface Config {
|
|
|
5
5
|
* - No cache is used for values <= 0
|
|
6
6
|
*/
|
|
7
7
|
cacheSize: number;
|
|
8
|
+
/**
|
|
9
|
+
* Prefix added to Tailwind-generated classes
|
|
10
|
+
* @see https://tailwindcss.com/docs/configuration#prefix
|
|
11
|
+
*/
|
|
12
|
+
prefix?: string;
|
|
8
13
|
/**
|
|
9
14
|
* Theme scales used in classGroups.
|
|
10
15
|
* The keys are the same as in the Tailwind config but the values are sometimes defined more broadly.
|
|
@@ -108,12 +108,14 @@ function getGroupIdForArbitraryProperty(className) {
|
|
|
108
108
|
|
|
109
109
|
|
|
110
110
|
function createClassMap(config) {
|
|
111
|
-
var theme = config.theme
|
|
111
|
+
var theme = config.theme,
|
|
112
|
+
prefix = config.prefix;
|
|
112
113
|
var classMap = {
|
|
113
114
|
nextPart: {},
|
|
114
115
|
validators: []
|
|
115
116
|
};
|
|
116
|
-
Object.entries(config.classGroups)
|
|
117
|
+
var prefixedClassGroupEntries = getPrefixedClassGroupEntries(Object.entries(config.classGroups), prefix);
|
|
118
|
+
prefixedClassGroupEntries.forEach(function (_ref2) {
|
|
117
119
|
var classGroupId = _ref2[0],
|
|
118
120
|
classGroup = _ref2[1];
|
|
119
121
|
processClassesRecursively(classGroup, classMap, classGroupId, theme);
|
|
@@ -169,6 +171,33 @@ function isThemeGetter(func) {
|
|
|
169
171
|
return func.isThemeGetter;
|
|
170
172
|
}
|
|
171
173
|
|
|
174
|
+
function getPrefixedClassGroupEntries(classGroupEntries, prefix) {
|
|
175
|
+
if (!prefix) {
|
|
176
|
+
return classGroupEntries;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return classGroupEntries.map(function (_ref4) {
|
|
180
|
+
var classGroupId = _ref4[0],
|
|
181
|
+
classGroup = _ref4[1];
|
|
182
|
+
var prefixedClassGroup = classGroup.map(function (classDefinition) {
|
|
183
|
+
if (typeof classDefinition === 'string') {
|
|
184
|
+
return prefix + classDefinition;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (typeof classDefinition === 'object') {
|
|
188
|
+
return Object.fromEntries(Object.entries(classDefinition).map(function (_ref5) {
|
|
189
|
+
var key = _ref5[0],
|
|
190
|
+
value = _ref5[1];
|
|
191
|
+
return [prefix + key, value];
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return classDefinition;
|
|
196
|
+
});
|
|
197
|
+
return [classGroupId, prefixedClassGroup];
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
|
|
172
201
|
function createConfigUtils(config) {
|
|
173
202
|
return _extends({
|
|
174
203
|
cache: getLruCache(config.cacheSize)
|
|
@@ -179,14 +208,14 @@ var SPLIT_CLASSES_REGEX = /\s+/;
|
|
|
179
208
|
var IMPORTANT_MODIFIER = '!'; // Regex is needed so we don't match against colons in labels for arbitrary values like `text-[color:var(--mystery-var)]`
|
|
180
209
|
// I'd prefer to use a negative lookbehind for all supported labels, but lookbheinds don't have good browser support yet. More info: https://caniuse.com/js-regexp-lookbehind
|
|
181
210
|
|
|
182
|
-
var
|
|
183
|
-
var
|
|
211
|
+
var MODIFIER_SEPARATOR_REGEX = /:(?![^[]*\])/;
|
|
212
|
+
var MODIFIER_SEPARATOR = ':';
|
|
184
213
|
function mergeClassList(classList, configUtils) {
|
|
185
214
|
var getClassGroupId = configUtils.getClassGroupId,
|
|
186
215
|
getConflictingClassGroupIds = configUtils.getConflictingClassGroupIds;
|
|
187
216
|
/**
|
|
188
217
|
* Set of classGroupIds in following format:
|
|
189
|
-
* `{importantModifier}{
|
|
218
|
+
* `{importantModifier}{variantModifiers}{classGroupId}`
|
|
190
219
|
* @example 'float'
|
|
191
220
|
* @example 'hover:focus:bg-color'
|
|
192
221
|
* @example '!md:pr'
|
|
@@ -194,8 +223,8 @@ function mergeClassList(classList, configUtils) {
|
|
|
194
223
|
|
|
195
224
|
var classGroupsInConflict = new Set();
|
|
196
225
|
return classList.trim().split(SPLIT_CLASSES_REGEX).map(function (originalClassName) {
|
|
197
|
-
var
|
|
198
|
-
var classNameWithImportantModifier =
|
|
226
|
+
var modifiers = originalClassName.split(MODIFIER_SEPARATOR_REGEX);
|
|
227
|
+
var classNameWithImportantModifier = modifiers.pop();
|
|
199
228
|
var hasImportantModifier = classNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER);
|
|
200
229
|
var className = hasImportantModifier ? classNameWithImportantModifier.substring(1) : classNameWithImportantModifier;
|
|
201
230
|
var classGroupId = getClassGroupId(className);
|
|
@@ -207,11 +236,11 @@ function mergeClassList(classList, configUtils) {
|
|
|
207
236
|
};
|
|
208
237
|
}
|
|
209
238
|
|
|
210
|
-
var
|
|
211
|
-
var
|
|
239
|
+
var variantModifier = modifiers.length === 0 ? '' : modifiers.sort().concat('').join(MODIFIER_SEPARATOR);
|
|
240
|
+
var fullModifier = hasImportantModifier ? IMPORTANT_MODIFIER + variantModifier : variantModifier;
|
|
212
241
|
return {
|
|
213
242
|
isTailwindClass: true,
|
|
214
|
-
|
|
243
|
+
modifier: fullModifier,
|
|
215
244
|
classGroupId: classGroupId,
|
|
216
245
|
originalClassName: originalClassName
|
|
217
246
|
};
|
|
@@ -221,9 +250,9 @@ function mergeClassList(classList, configUtils) {
|
|
|
221
250
|
return true;
|
|
222
251
|
}
|
|
223
252
|
|
|
224
|
-
var
|
|
253
|
+
var modifier = parsed.modifier,
|
|
225
254
|
classGroupId = parsed.classGroupId;
|
|
226
|
-
var classId =
|
|
255
|
+
var classId = modifier + ":" + classGroupId;
|
|
227
256
|
|
|
228
257
|
if (classGroupsInConflict.has(classId)) {
|
|
229
258
|
return false;
|
|
@@ -231,7 +260,7 @@ function mergeClassList(classList, configUtils) {
|
|
|
231
260
|
|
|
232
261
|
classGroupsInConflict.add(classId);
|
|
233
262
|
getConflictingClassGroupIds(classGroupId).forEach(function (group) {
|
|
234
|
-
return classGroupsInConflict.add(
|
|
263
|
+
return classGroupsInConflict.add(modifier + ":" + group);
|
|
235
264
|
});
|
|
236
265
|
return true;
|
|
237
266
|
}).reverse().map(function (parsed) {
|