@telepix-lab/telepix-ui 0.9.1 → 0.9.3

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/esm/index.js CHANGED
@@ -5,36 +5,7 @@ import { toast, Toaster } from 'sonner';
5
5
 
6
6
  function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f);}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}
7
7
 
8
- /**
9
- * Concatenates two arrays faster than the array spread operator.
10
- */
11
- const concatArrays = (array1, array2) => {
12
- // Pre-allocate for better V8 optimization
13
- const combinedArray = new Array(array1.length + array2.length);
14
- for (let i = 0; i < array1.length; i++) {
15
- combinedArray[i] = array1[i];
16
- }
17
- for (let i = 0; i < array2.length; i++) {
18
- combinedArray[array1.length + i] = array2[i];
19
- }
20
- return combinedArray;
21
- };
22
-
23
- // Factory function ensures consistent object shapes
24
- const createClassValidatorObject = (classGroupId, validator) => ({
25
- classGroupId,
26
- validator
27
- });
28
- // Factory ensures consistent ClassPartObject shape
29
- const createClassPartObject = (nextPart = new Map(), validators = null, classGroupId) => ({
30
- nextPart,
31
- validators,
32
- classGroupId
33
- });
34
8
  const CLASS_PART_SEPARATOR = '-';
35
- const EMPTY_CONFLICTS = [];
36
- // I use two dots here because one dot is used as prefix for class groups in plugins
37
- const ARBITRARY_PROPERTY_PREFIX = 'arbitrary..';
38
9
  const createClassGroupUtils = config => {
39
10
  const classMap = createClassMap(config);
40
11
  const {
@@ -42,73 +13,54 @@ const createClassGroupUtils = config => {
42
13
  conflictingClassGroupModifiers
43
14
  } = config;
44
15
  const getClassGroupId = className => {
45
- if (className.startsWith('[') && className.endsWith(']')) {
46
- return getGroupIdForArbitraryProperty(className);
47
- }
48
16
  const classParts = className.split(CLASS_PART_SEPARATOR);
49
- // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and skip it.
50
- const startIndex = classParts[0] === '' && classParts.length > 1 ? 1 : 0;
51
- return getGroupRecursive(classParts, startIndex, classMap);
17
+ // 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.
18
+ if (classParts[0] === '' && classParts.length !== 1) {
19
+ classParts.shift();
20
+ }
21
+ return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);
52
22
  };
53
23
  const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {
54
- if (hasPostfixModifier) {
55
- const modifierConflicts = conflictingClassGroupModifiers[classGroupId];
56
- const baseConflicts = conflictingClassGroups[classGroupId];
57
- if (modifierConflicts) {
58
- if (baseConflicts) {
59
- // Merge base conflicts with modifier conflicts
60
- return concatArrays(baseConflicts, modifierConflicts);
61
- }
62
- // Only modifier conflicts
63
- return modifierConflicts;
64
- }
65
- // Fall back to without postfix if no modifier conflicts
66
- return baseConflicts || EMPTY_CONFLICTS;
24
+ const conflicts = conflictingClassGroups[classGroupId] || [];
25
+ if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {
26
+ return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]];
67
27
  }
68
- return conflictingClassGroups[classGroupId] || EMPTY_CONFLICTS;
28
+ return conflicts;
69
29
  };
70
30
  return {
71
31
  getClassGroupId,
72
32
  getConflictingClassGroupIds
73
33
  };
74
34
  };
75
- const getGroupRecursive = (classParts, startIndex, classPartObject) => {
76
- const classPathsLength = classParts.length - startIndex;
77
- if (classPathsLength === 0) {
35
+ const getGroupRecursive = (classParts, classPartObject) => {
36
+ if (classParts.length === 0) {
78
37
  return classPartObject.classGroupId;
79
38
  }
80
- const currentClassPart = classParts[startIndex];
39
+ const currentClassPart = classParts[0];
81
40
  const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);
82
- if (nextClassPartObject) {
83
- const result = getGroupRecursive(classParts, startIndex + 1, nextClassPartObject);
84
- if (result) return result;
41
+ const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : undefined;
42
+ if (classGroupFromNextClassPart) {
43
+ return classGroupFromNextClassPart;
85
44
  }
86
- const validators = classPartObject.validators;
87
- if (validators === null) {
45
+ if (classPartObject.validators.length === 0) {
88
46
  return undefined;
89
47
  }
90
- // Build classRest string efficiently by joining from startIndex onwards
91
- const classRest = startIndex === 0 ? classParts.join(CLASS_PART_SEPARATOR) : classParts.slice(startIndex).join(CLASS_PART_SEPARATOR);
92
- const validatorsLength = validators.length;
93
- for (let i = 0; i < validatorsLength; i++) {
94
- const validatorObj = validators[i];
95
- if (validatorObj.validator(classRest)) {
96
- return validatorObj.classGroupId;
48
+ const classRest = classParts.join(CLASS_PART_SEPARATOR);
49
+ return classPartObject.validators.find(({
50
+ validator
51
+ }) => validator(classRest))?.classGroupId;
52
+ };
53
+ const arbitraryPropertyRegex = /^\[(.+)\]$/;
54
+ const getGroupIdForArbitraryProperty = className => {
55
+ if (arbitraryPropertyRegex.test(className)) {
56
+ const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];
57
+ const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(':'));
58
+ if (property) {
59
+ // I use two dots here because one dot is used as prefix for class groups in plugins
60
+ return 'arbitrary..' + property;
97
61
  }
98
62
  }
99
- return undefined;
100
63
  };
101
- /**
102
- * Get the class group ID for an arbitrary property.
103
- *
104
- * @param className - The class name to get the group ID for. Is expected to be string starting with `[` and ending with `]`.
105
- */
106
- const getGroupIdForArbitraryProperty = className => className.slice(1, -1).indexOf(':') === -1 ? undefined : (() => {
107
- const content = className.slice(1, -1);
108
- const colonIndex = content.indexOf(':');
109
- const property = content.slice(0, colonIndex);
110
- return property ? ARBITRARY_PROPERTY_PREFIX + property : undefined;
111
- })();
112
64
  /**
113
65
  * Exported for testing only
114
66
  */
@@ -117,77 +69,54 @@ const createClassMap = config => {
117
69
  theme,
118
70
  classGroups
119
71
  } = config;
120
- return processClassGroups(classGroups, theme);
121
- };
122
- // Split into separate functions to maintain monomorphic call sites
123
- const processClassGroups = (classGroups, theme) => {
124
- const classMap = createClassPartObject();
72
+ const classMap = {
73
+ nextPart: new Map(),
74
+ validators: []
75
+ };
125
76
  for (const classGroupId in classGroups) {
126
- const group = classGroups[classGroupId];
127
- processClassesRecursively(group, classMap, classGroupId, theme);
77
+ processClassesRecursively(classGroups[classGroupId], classMap, classGroupId, theme);
128
78
  }
129
79
  return classMap;
130
80
  };
131
81
  const processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {
132
- const len = classGroup.length;
133
- for (let i = 0; i < len; i++) {
134
- const classDefinition = classGroup[i];
135
- processClassDefinition(classDefinition, classPartObject, classGroupId, theme);
136
- }
137
- };
138
- // Split into separate functions for each type to maintain monomorphic call sites
139
- const processClassDefinition = (classDefinition, classPartObject, classGroupId, theme) => {
140
- if (typeof classDefinition === 'string') {
141
- processStringDefinition(classDefinition, classPartObject, classGroupId);
142
- return;
143
- }
144
- if (typeof classDefinition === 'function') {
145
- processFunctionDefinition(classDefinition, classPartObject, classGroupId, theme);
146
- return;
147
- }
148
- processObjectDefinition(classDefinition, classPartObject, classGroupId, theme);
149
- };
150
- const processStringDefinition = (classDefinition, classPartObject, classGroupId) => {
151
- const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);
152
- classPartObjectToEdit.classGroupId = classGroupId;
153
- };
154
- const processFunctionDefinition = (classDefinition, classPartObject, classGroupId, theme) => {
155
- if (isThemeGetter(classDefinition)) {
156
- processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);
157
- return;
158
- }
159
- if (classPartObject.validators === null) {
160
- classPartObject.validators = [];
161
- }
162
- classPartObject.validators.push(createClassValidatorObject(classGroupId, classDefinition));
163
- };
164
- const processObjectDefinition = (classDefinition, classPartObject, classGroupId, theme) => {
165
- const entries = Object.entries(classDefinition);
166
- const len = entries.length;
167
- for (let i = 0; i < len; i++) {
168
- const [key, value] = entries[i];
169
- processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme);
170
- }
82
+ classGroup.forEach(classDefinition => {
83
+ if (typeof classDefinition === 'string') {
84
+ const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);
85
+ classPartObjectToEdit.classGroupId = classGroupId;
86
+ return;
87
+ }
88
+ if (typeof classDefinition === 'function') {
89
+ if (isThemeGetter(classDefinition)) {
90
+ processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);
91
+ return;
92
+ }
93
+ classPartObject.validators.push({
94
+ validator: classDefinition,
95
+ classGroupId
96
+ });
97
+ return;
98
+ }
99
+ Object.entries(classDefinition).forEach(([key, classGroup]) => {
100
+ processClassesRecursively(classGroup, getPart(classPartObject, key), classGroupId, theme);
101
+ });
102
+ });
171
103
  };
172
104
  const getPart = (classPartObject, path) => {
173
- let current = classPartObject;
174
- const parts = path.split(CLASS_PART_SEPARATOR);
175
- const len = parts.length;
176
- for (let i = 0; i < len; i++) {
177
- const part = parts[i];
178
- let next = current.nextPart.get(part);
179
- if (!next) {
180
- next = createClassPartObject();
181
- current.nextPart.set(part, next);
182
- }
183
- current = next;
184
- }
185
- return current;
105
+ let currentClassPartObject = classPartObject;
106
+ path.split(CLASS_PART_SEPARATOR).forEach(pathPart => {
107
+ if (!currentClassPartObject.nextPart.has(pathPart)) {
108
+ currentClassPartObject.nextPart.set(pathPart, {
109
+ nextPart: new Map(),
110
+ validators: []
111
+ });
112
+ }
113
+ currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);
114
+ });
115
+ return currentClassPartObject;
186
116
  };
187
- // Type guard maintains monomorphic check
188
- const isThemeGetter = func => 'isThemeGetter' in func && func.isThemeGetter === true;
117
+ const isThemeGetter = func => func.isThemeGetter;
189
118
 
190
- // LRU cache implementation using plain objects for simplicity
119
+ // LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance
191
120
  const createLruCache = maxCacheSize => {
192
121
  if (maxCacheSize < 1) {
193
122
  return {
@@ -196,31 +125,31 @@ const createLruCache = maxCacheSize => {
196
125
  };
197
126
  }
198
127
  let cacheSize = 0;
199
- let cache = Object.create(null);
200
- let previousCache = Object.create(null);
128
+ let cache = new Map();
129
+ let previousCache = new Map();
201
130
  const update = (key, value) => {
202
- cache[key] = value;
131
+ cache.set(key, value);
203
132
  cacheSize++;
204
133
  if (cacheSize > maxCacheSize) {
205
134
  cacheSize = 0;
206
135
  previousCache = cache;
207
- cache = Object.create(null);
136
+ cache = new Map();
208
137
  }
209
138
  };
210
139
  return {
211
140
  get(key) {
212
- let value = cache[key];
141
+ let value = cache.get(key);
213
142
  if (value !== undefined) {
214
143
  return value;
215
144
  }
216
- if ((value = previousCache[key]) !== undefined) {
145
+ if ((value = previousCache.get(key)) !== undefined) {
217
146
  update(key, value);
218
147
  return value;
219
148
  }
220
149
  },
221
150
  set(key, value) {
222
- if (key in cache) {
223
- cache[key] = value;
151
+ if (cache.has(key)) {
152
+ cache.set(key, value);
224
153
  } else {
225
154
  update(key, value);
226
155
  }
@@ -229,15 +158,7 @@ const createLruCache = maxCacheSize => {
229
158
  };
230
159
  const IMPORTANT_MODIFIER = '!';
231
160
  const MODIFIER_SEPARATOR = ':';
232
- const EMPTY_MODIFIERS = [];
233
- // Pre-allocated result object shape for consistency
234
- const createResultObject = (modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition, isExternal) => ({
235
- modifiers,
236
- hasImportantModifier,
237
- baseClassName,
238
- maybePostfixModifierPosition,
239
- isExternal
240
- });
161
+ const MODIFIER_SEPARATOR_LENGTH = MODIFIER_SEPARATOR.length;
241
162
  const createParseClassName = config => {
242
163
  const {
243
164
  prefix,
@@ -250,19 +171,17 @@ const createParseClassName = config => {
250
171
  * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js
251
172
  */
252
173
  let parseClassName = className => {
253
- // Use simple array with push for better performance
254
174
  const modifiers = [];
255
175
  let bracketDepth = 0;
256
176
  let parenDepth = 0;
257
177
  let modifierStart = 0;
258
178
  let postfixModifierPosition;
259
- const len = className.length;
260
- for (let index = 0; index < len; index++) {
261
- const currentCharacter = className[index];
179
+ for (let index = 0; index < className.length; index++) {
180
+ let currentCharacter = className[index];
262
181
  if (bracketDepth === 0 && parenDepth === 0) {
263
182
  if (currentCharacter === MODIFIER_SEPARATOR) {
264
183
  modifiers.push(className.slice(modifierStart, index));
265
- modifierStart = index + 1;
184
+ modifierStart = index + MODIFIER_SEPARATOR_LENGTH;
266
185
  continue;
267
186
  }
268
187
  if (currentCharacter === '/') {
@@ -270,31 +189,37 @@ const createParseClassName = config => {
270
189
  continue;
271
190
  }
272
191
  }
273
- if (currentCharacter === '[') bracketDepth++;else if (currentCharacter === ']') bracketDepth--;else if (currentCharacter === '(') parenDepth++;else if (currentCharacter === ')') parenDepth--;
274
- }
275
- const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.slice(modifierStart);
276
- // Inline important modifier check
277
- let baseClassName = baseClassNameWithImportantModifier;
278
- let hasImportantModifier = false;
279
- if (baseClassNameWithImportantModifier.endsWith(IMPORTANT_MODIFIER)) {
280
- baseClassName = baseClassNameWithImportantModifier.slice(0, -1);
281
- hasImportantModifier = true;
282
- } else if (
283
- /**
284
- * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.
285
- * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864
286
- */
287
- baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)) {
288
- baseClassName = baseClassNameWithImportantModifier.slice(1);
289
- hasImportantModifier = true;
192
+ if (currentCharacter === '[') {
193
+ bracketDepth++;
194
+ } else if (currentCharacter === ']') {
195
+ bracketDepth--;
196
+ } else if (currentCharacter === '(') {
197
+ parenDepth++;
198
+ } else if (currentCharacter === ')') {
199
+ parenDepth--;
200
+ }
290
201
  }
202
+ const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart);
203
+ const baseClassName = stripImportantModifier(baseClassNameWithImportantModifier);
204
+ const hasImportantModifier = baseClassName !== baseClassNameWithImportantModifier;
291
205
  const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;
292
- return createResultObject(modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition);
206
+ return {
207
+ modifiers,
208
+ hasImportantModifier,
209
+ baseClassName,
210
+ maybePostfixModifierPosition
211
+ };
293
212
  };
294
213
  if (prefix) {
295
214
  const fullPrefix = prefix + MODIFIER_SEPARATOR;
296
215
  const parseClassNameOriginal = parseClassName;
297
- parseClassName = className => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.slice(fullPrefix.length)) : createResultObject(EMPTY_MODIFIERS, false, className, undefined, true);
216
+ parseClassName = className => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.substring(fullPrefix.length)) : {
217
+ isExternal: true,
218
+ modifiers: [],
219
+ hasImportantModifier: false,
220
+ baseClassName: className,
221
+ maybePostfixModifierPosition: undefined
222
+ };
298
223
  }
299
224
  if (experimentalParseClassName) {
300
225
  const parseClassNameOriginal = parseClassName;
@@ -305,6 +230,19 @@ const createParseClassName = config => {
305
230
  }
306
231
  return parseClassName;
307
232
  };
233
+ const stripImportantModifier = baseClassName => {
234
+ if (baseClassName.endsWith(IMPORTANT_MODIFIER)) {
235
+ return baseClassName.substring(0, baseClassName.length - 1);
236
+ }
237
+ /**
238
+ * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.
239
+ * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864
240
+ */
241
+ if (baseClassName.startsWith(IMPORTANT_MODIFIER)) {
242
+ return baseClassName.substring(1);
243
+ }
244
+ return baseClassName;
245
+ };
308
246
 
309
247
  /**
310
248
  * Sorts modifiers according to following schema:
@@ -312,41 +250,26 @@ const createParseClassName = config => {
312
250
  * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it
313
251
  */
314
252
  const createSortModifiers = config => {
315
- // Pre-compute weights for all known modifiers for O(1) comparison
316
- const modifierWeights = new Map();
317
- // Assign weights to sensitive modifiers (highest priority, but preserve order)
318
- config.orderSensitiveModifiers.forEach((mod, index) => {
319
- modifierWeights.set(mod, 1000000 + index); // High weights for sensitive mods
320
- });
321
- return modifiers => {
322
- const result = [];
323
- let currentSegment = [];
324
- // Process modifiers in one pass
325
- for (let i = 0; i < modifiers.length; i++) {
326
- const modifier = modifiers[i];
327
- // Check if modifier is sensitive (starts with '[' or in orderSensitiveModifiers)
328
- const isArbitrary = modifier[0] === '[';
329
- const isOrderSensitive = modifierWeights.has(modifier);
330
- if (isArbitrary || isOrderSensitive) {
331
- // Sort and flush current segment alphabetically
332
- if (currentSegment.length > 0) {
333
- currentSegment.sort();
334
- result.push(...currentSegment);
335
- currentSegment = [];
336
- }
337
- result.push(modifier);
253
+ const orderSensitiveModifiers = Object.fromEntries(config.orderSensitiveModifiers.map(modifier => [modifier, true]));
254
+ const sortModifiers = modifiers => {
255
+ if (modifiers.length <= 1) {
256
+ return modifiers;
257
+ }
258
+ const sortedModifiers = [];
259
+ let unsortedModifiers = [];
260
+ modifiers.forEach(modifier => {
261
+ const isPositionSensitive = modifier[0] === '[' || orderSensitiveModifiers[modifier];
262
+ if (isPositionSensitive) {
263
+ sortedModifiers.push(...unsortedModifiers.sort(), modifier);
264
+ unsortedModifiers = [];
338
265
  } else {
339
- // Regular modifier - add to current segment for batch sorting
340
- currentSegment.push(modifier);
266
+ unsortedModifiers.push(modifier);
341
267
  }
342
- }
343
- // Sort and add any remaining segment items
344
- if (currentSegment.length > 0) {
345
- currentSegment.sort();
346
- result.push(...currentSegment);
347
- }
348
- return result;
268
+ });
269
+ sortedModifiers.push(...unsortedModifiers.sort());
270
+ return sortedModifiers;
349
271
  };
272
+ return sortModifiers;
350
273
  };
351
274
  const createConfigUtils = config => ({
352
275
  cache: createLruCache(config.cacheSize),
@@ -401,11 +324,10 @@ const mergeClassList = (classList, configUtils) => {
401
324
  }
402
325
  hasPostfixModifier = false;
403
326
  }
404
- // Fast path: skip sorting for empty or single modifier
405
- const variantModifier = modifiers.length === 0 ? '' : modifiers.length === 1 ? modifiers[0] : sortModifiers(modifiers).join(':');
327
+ const variantModifier = sortModifiers(modifiers).join(':');
406
328
  const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;
407
329
  const classId = modifierId + classGroupId;
408
- if (classGroupsInConflict.indexOf(classId) > -1) {
330
+ if (classGroupsInConflict.includes(classId)) {
409
331
  // Tailwind class omitted due to conflict
410
332
  continue;
411
333
  }
@@ -430,13 +352,13 @@ const mergeClassList = (classList, configUtils) => {
430
352
  *
431
353
  * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)
432
354
  */
433
- const twJoin = (...classLists) => {
355
+ function twJoin() {
434
356
  let index = 0;
435
357
  let argument;
436
358
  let resolvedValue;
437
359
  let string = '';
438
- while (index < classLists.length) {
439
- if (argument = classLists[index++]) {
360
+ while (index < arguments.length) {
361
+ if (argument = arguments[index++]) {
440
362
  if (resolvedValue = toValue(argument)) {
441
363
  string && (string += ' ');
442
364
  string += resolvedValue;
@@ -444,9 +366,8 @@ const twJoin = (...classLists) => {
444
366
  }
445
367
  }
446
368
  return string;
447
- };
369
+ }
448
370
  const toValue = mix => {
449
- // Fast path for strings
450
371
  if (typeof mix === 'string') {
451
372
  return mix;
452
373
  }
@@ -462,20 +383,20 @@ const toValue = mix => {
462
383
  }
463
384
  return string;
464
385
  };
465
- const createTailwindMerge = (createConfigFirst, ...createConfigRest) => {
386
+ function createTailwindMerge(createConfigFirst, ...createConfigRest) {
466
387
  let configUtils;
467
388
  let cacheGet;
468
389
  let cacheSet;
469
- let functionToCall;
470
- const initTailwindMerge = classList => {
390
+ let functionToCall = initTailwindMerge;
391
+ function initTailwindMerge(classList) {
471
392
  const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());
472
393
  configUtils = createConfigUtils(config);
473
394
  cacheGet = configUtils.cache.get;
474
395
  cacheSet = configUtils.cache.set;
475
396
  functionToCall = tailwindMerge;
476
397
  return tailwindMerge(classList);
477
- };
478
- const tailwindMerge = classList => {
398
+ }
399
+ function tailwindMerge(classList) {
479
400
  const cachedResult = cacheGet(classList);
480
401
  if (cachedResult) {
481
402
  return cachedResult;
@@ -483,19 +404,19 @@ const createTailwindMerge = (createConfigFirst, ...createConfigRest) => {
483
404
  const result = mergeClassList(classList, configUtils);
484
405
  cacheSet(classList, result);
485
406
  return result;
407
+ }
408
+ return function callTailwindMerge() {
409
+ return functionToCall(twJoin.apply(null, arguments));
486
410
  };
487
- functionToCall = initTailwindMerge;
488
- return (...args) => functionToCall(twJoin(...args));
489
- };
490
- const fallbackThemeArr = [];
411
+ }
491
412
  const fromTheme = key => {
492
- const themeGetter = theme => theme[key] || fallbackThemeArr;
413
+ const themeGetter = theme => theme[key] || [];
493
414
  themeGetter.isThemeGetter = true;
494
415
  return themeGetter;
495
416
  };
496
417
  const arbitraryValueRegex = /^\[(?:(\w[\w-]*):)?(.+)\]$/i;
497
418
  const arbitraryVariableRegex = /^\((?:(\w[\w-]*):)?(.+)\)$/i;
498
- const fractionRegex = /^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/;
419
+ const fractionRegex = /^\d+\/\d+$/;
499
420
  const tshirtUnitRegex = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/;
500
421
  const lengthUnitRegex = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/;
501
422
  const colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/;
@@ -521,8 +442,6 @@ const isArbitrarySize = value => getIsArbitraryValue(value, isLabelSize, isNever
521
442
  const isArbitraryValue = value => arbitraryValueRegex.test(value);
522
443
  const isArbitraryLength = value => getIsArbitraryValue(value, isLabelLength, isLengthOnly);
523
444
  const isArbitraryNumber = value => getIsArbitraryValue(value, isLabelNumber, isNumber);
524
- const isArbitraryWeight = value => getIsArbitraryValue(value, isLabelWeight, isAny);
525
- const isArbitraryFamilyName = value => getIsArbitraryValue(value, isLabelFamilyName, isNever);
526
445
  const isArbitraryPosition = value => getIsArbitraryValue(value, isLabelPosition, isNever);
527
446
  const isArbitraryImage = value => getIsArbitraryValue(value, isLabelImage, isImage);
528
447
  const isArbitraryShadow = value => getIsArbitraryValue(value, isLabelShadow, isShadow);
@@ -533,7 +452,6 @@ const isArbitraryVariablePosition = value => getIsArbitraryVariable(value, isLab
533
452
  const isArbitraryVariableSize = value => getIsArbitraryVariable(value, isLabelSize);
534
453
  const isArbitraryVariableImage = value => getIsArbitraryVariable(value, isLabelImage);
535
454
  const isArbitraryVariableShadow = value => getIsArbitraryVariable(value, isLabelShadow, true);
536
- const isArbitraryVariableWeight = value => getIsArbitraryVariable(value, isLabelWeight, true);
537
455
  // Helpers
538
456
  const getIsArbitraryValue = (value, testLabel, testValue) => {
539
457
  const result = arbitraryValueRegex.exec(value);
@@ -562,7 +480,6 @@ const isLabelSize = label => label === 'length' || label === 'size' || label ===
562
480
  const isLabelLength = label => label === 'length';
563
481
  const isLabelNumber = label => label === 'number';
564
482
  const isLabelFamilyName = label => label === 'family-name';
565
- const isLabelWeight = label => label === 'number' || label === 'weight';
566
483
  const isLabelShadow = label => label === 'shadow';
567
484
  const getDefaultConfig = () => {
568
485
  /**
@@ -621,8 +538,6 @@ const getDefaultConfig = () => {
621
538
  const scaleAlignSecondaryAxis = () => ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'];
622
539
  const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()];
623
540
  const scaleSizing = () => [isFraction, 'auto', 'full', 'dvw', 'dvh', 'lvw', 'lvh', 'svw', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];
624
- const scaleSizingInline = () => [isFraction, 'screen', 'full', 'dvw', 'lvw', 'svw', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];
625
- const scaleSizingBlock = () => [isFraction, 'screen', 'full', 'lh', 'dvh', 'lvh', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];
626
541
  const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue];
627
542
  const scaleBgPosition = () => [...scalePosition(), isArbitraryVariablePosition, isArbitraryPosition, {
628
543
  position: [isArbitraryVariable, isArbitraryValue]
@@ -821,66 +736,40 @@ const getDefaultConfig = () => {
821
736
  */
822
737
  position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],
823
738
  /**
824
- * Inset
739
+ * Top / Right / Bottom / Left
825
740
  * @see https://tailwindcss.com/docs/top-right-bottom-left
826
741
  */
827
742
  inset: [{
828
743
  inset: scaleInset()
829
744
  }],
830
745
  /**
831
- * Inset Inline
746
+ * Right / Left
832
747
  * @see https://tailwindcss.com/docs/top-right-bottom-left
833
748
  */
834
749
  'inset-x': [{
835
750
  'inset-x': scaleInset()
836
751
  }],
837
752
  /**
838
- * Inset Block
753
+ * Top / Bottom
839
754
  * @see https://tailwindcss.com/docs/top-right-bottom-left
840
755
  */
841
756
  'inset-y': [{
842
757
  'inset-y': scaleInset()
843
758
  }],
844
759
  /**
845
- * Inset Inline Start
760
+ * Start
846
761
  * @see https://tailwindcss.com/docs/top-right-bottom-left
847
- * @todo class group will be renamed to `inset-s` in next major release
848
762
  */
849
763
  start: [{
850
- 'inset-s': scaleInset(),
851
- /**
852
- * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-s-*` utilities.
853
- * @see https://github.com/tailwindlabs/tailwindcss/pull/19613
854
- */
855
764
  start: scaleInset()
856
765
  }],
857
766
  /**
858
- * Inset Inline End
767
+ * End
859
768
  * @see https://tailwindcss.com/docs/top-right-bottom-left
860
- * @todo class group will be renamed to `inset-e` in next major release
861
769
  */
862
770
  end: [{
863
- 'inset-e': scaleInset(),
864
- /**
865
- * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-e-*` utilities.
866
- * @see https://github.com/tailwindlabs/tailwindcss/pull/19613
867
- */
868
771
  end: scaleInset()
869
772
  }],
870
- /**
871
- * Inset Block Start
872
- * @see https://tailwindcss.com/docs/top-right-bottom-left
873
- */
874
- 'inset-bs': [{
875
- 'inset-bs': scaleInset()
876
- }],
877
- /**
878
- * Inset Block End
879
- * @see https://tailwindcss.com/docs/top-right-bottom-left
880
- */
881
- 'inset-be': [{
882
- 'inset-be': scaleInset()
883
- }],
884
773
  /**
885
774
  * Top
886
775
  * @see https://tailwindcss.com/docs/top-right-bottom-left
@@ -1147,47 +1036,33 @@ const getDefaultConfig = () => {
1147
1036
  p: scaleUnambiguousSpacing()
1148
1037
  }],
1149
1038
  /**
1150
- * Padding Inline
1039
+ * Padding X
1151
1040
  * @see https://tailwindcss.com/docs/padding
1152
1041
  */
1153
1042
  px: [{
1154
1043
  px: scaleUnambiguousSpacing()
1155
1044
  }],
1156
1045
  /**
1157
- * Padding Block
1046
+ * Padding Y
1158
1047
  * @see https://tailwindcss.com/docs/padding
1159
1048
  */
1160
1049
  py: [{
1161
1050
  py: scaleUnambiguousSpacing()
1162
1051
  }],
1163
1052
  /**
1164
- * Padding Inline Start
1053
+ * Padding Start
1165
1054
  * @see https://tailwindcss.com/docs/padding
1166
1055
  */
1167
1056
  ps: [{
1168
1057
  ps: scaleUnambiguousSpacing()
1169
1058
  }],
1170
1059
  /**
1171
- * Padding Inline End
1060
+ * Padding End
1172
1061
  * @see https://tailwindcss.com/docs/padding
1173
1062
  */
1174
1063
  pe: [{
1175
1064
  pe: scaleUnambiguousSpacing()
1176
1065
  }],
1177
- /**
1178
- * Padding Block Start
1179
- * @see https://tailwindcss.com/docs/padding
1180
- */
1181
- pbs: [{
1182
- pbs: scaleUnambiguousSpacing()
1183
- }],
1184
- /**
1185
- * Padding Block End
1186
- * @see https://tailwindcss.com/docs/padding
1187
- */
1188
- pbe: [{
1189
- pbe: scaleUnambiguousSpacing()
1190
- }],
1191
1066
  /**
1192
1067
  * Padding Top
1193
1068
  * @see https://tailwindcss.com/docs/padding
@@ -1224,47 +1099,33 @@ const getDefaultConfig = () => {
1224
1099
  m: scaleMargin()
1225
1100
  }],
1226
1101
  /**
1227
- * Margin Inline
1102
+ * Margin X
1228
1103
  * @see https://tailwindcss.com/docs/margin
1229
1104
  */
1230
1105
  mx: [{
1231
1106
  mx: scaleMargin()
1232
1107
  }],
1233
1108
  /**
1234
- * Margin Block
1109
+ * Margin Y
1235
1110
  * @see https://tailwindcss.com/docs/margin
1236
1111
  */
1237
1112
  my: [{
1238
1113
  my: scaleMargin()
1239
1114
  }],
1240
1115
  /**
1241
- * Margin Inline Start
1116
+ * Margin Start
1242
1117
  * @see https://tailwindcss.com/docs/margin
1243
1118
  */
1244
1119
  ms: [{
1245
1120
  ms: scaleMargin()
1246
1121
  }],
1247
1122
  /**
1248
- * Margin Inline End
1123
+ * Margin End
1249
1124
  * @see https://tailwindcss.com/docs/margin
1250
1125
  */
1251
1126
  me: [{
1252
1127
  me: scaleMargin()
1253
1128
  }],
1254
- /**
1255
- * Margin Block Start
1256
- * @see https://tailwindcss.com/docs/margin
1257
- */
1258
- mbs: [{
1259
- mbs: scaleMargin()
1260
- }],
1261
- /**
1262
- * Margin Block End
1263
- * @see https://tailwindcss.com/docs/margin
1264
- */
1265
- mbe: [{
1266
- mbe: scaleMargin()
1267
- }],
1268
1129
  /**
1269
1130
  * Margin Top
1270
1131
  * @see https://tailwindcss.com/docs/margin
@@ -1327,48 +1188,6 @@ const getDefaultConfig = () => {
1327
1188
  size: [{
1328
1189
  size: scaleSizing()
1329
1190
  }],
1330
- /**
1331
- * Inline Size
1332
- * @see https://tailwindcss.com/docs/width
1333
- */
1334
- 'inline-size': [{
1335
- inline: ['auto', ...scaleSizingInline()]
1336
- }],
1337
- /**
1338
- * Min-Inline Size
1339
- * @see https://tailwindcss.com/docs/min-width
1340
- */
1341
- 'min-inline-size': [{
1342
- 'min-inline': ['auto', ...scaleSizingInline()]
1343
- }],
1344
- /**
1345
- * Max-Inline Size
1346
- * @see https://tailwindcss.com/docs/max-width
1347
- */
1348
- 'max-inline-size': [{
1349
- 'max-inline': ['none', ...scaleSizingInline()]
1350
- }],
1351
- /**
1352
- * Block Size
1353
- * @see https://tailwindcss.com/docs/height
1354
- */
1355
- 'block-size': [{
1356
- block: ['auto', ...scaleSizingBlock()]
1357
- }],
1358
- /**
1359
- * Min-Block Size
1360
- * @see https://tailwindcss.com/docs/min-height
1361
- */
1362
- 'min-block-size': [{
1363
- 'min-block': ['auto', ...scaleSizingBlock()]
1364
- }],
1365
- /**
1366
- * Max-Block Size
1367
- * @see https://tailwindcss.com/docs/max-height
1368
- */
1369
- 'max-block-size': [{
1370
- 'max-block': ['none', ...scaleSizingBlock()]
1371
- }],
1372
1191
  /**
1373
1192
  * Width
1374
1193
  * @see https://tailwindcss.com/docs/width
@@ -1441,7 +1260,7 @@ const getDefaultConfig = () => {
1441
1260
  * @see https://tailwindcss.com/docs/font-weight
1442
1261
  */
1443
1262
  'font-weight': [{
1444
- font: [themeFontWeight, isArbitraryVariableWeight, isArbitraryWeight]
1263
+ font: [themeFontWeight, isArbitraryVariable, isArbitraryNumber]
1445
1264
  }],
1446
1265
  /**
1447
1266
  * Font Stretch
@@ -1455,14 +1274,7 @@ const getDefaultConfig = () => {
1455
1274
  * @see https://tailwindcss.com/docs/font-family
1456
1275
  */
1457
1276
  'font-family': [{
1458
- font: [isArbitraryVariableFamilyName, isArbitraryFamilyName, themeFont]
1459
- }],
1460
- /**
1461
- * Font Feature Settings
1462
- * @see https://tailwindcss.com/docs/font-feature-settings
1463
- */
1464
- 'font-features': [{
1465
- 'font-features': [isArbitraryValue]
1277
+ font: [isArbitraryVariableFamilyName, isArbitraryValue, themeFont]
1466
1278
  }],
1467
1279
  /**
1468
1280
  * Font Variant Numeric
@@ -1881,47 +1693,33 @@ const getDefaultConfig = () => {
1881
1693
  border: scaleBorderWidth()
1882
1694
  }],
1883
1695
  /**
1884
- * Border Width Inline
1696
+ * Border Width X
1885
1697
  * @see https://tailwindcss.com/docs/border-width
1886
1698
  */
1887
1699
  'border-w-x': [{
1888
1700
  'border-x': scaleBorderWidth()
1889
1701
  }],
1890
1702
  /**
1891
- * Border Width Block
1703
+ * Border Width Y
1892
1704
  * @see https://tailwindcss.com/docs/border-width
1893
1705
  */
1894
1706
  'border-w-y': [{
1895
1707
  'border-y': scaleBorderWidth()
1896
1708
  }],
1897
1709
  /**
1898
- * Border Width Inline Start
1710
+ * Border Width Start
1899
1711
  * @see https://tailwindcss.com/docs/border-width
1900
1712
  */
1901
1713
  'border-w-s': [{
1902
1714
  'border-s': scaleBorderWidth()
1903
1715
  }],
1904
1716
  /**
1905
- * Border Width Inline End
1717
+ * Border Width End
1906
1718
  * @see https://tailwindcss.com/docs/border-width
1907
1719
  */
1908
1720
  'border-w-e': [{
1909
1721
  'border-e': scaleBorderWidth()
1910
1722
  }],
1911
- /**
1912
- * Border Width Block Start
1913
- * @see https://tailwindcss.com/docs/border-width
1914
- */
1915
- 'border-w-bs': [{
1916
- 'border-bs': scaleBorderWidth()
1917
- }],
1918
- /**
1919
- * Border Width Block End
1920
- * @see https://tailwindcss.com/docs/border-width
1921
- */
1922
- 'border-w-be': [{
1923
- 'border-be': scaleBorderWidth()
1924
- }],
1925
1723
  /**
1926
1724
  * Border Width Top
1927
1725
  * @see https://tailwindcss.com/docs/border-width
@@ -1996,47 +1794,33 @@ const getDefaultConfig = () => {
1996
1794
  border: scaleColor()
1997
1795
  }],
1998
1796
  /**
1999
- * Border Color Inline
1797
+ * Border Color X
2000
1798
  * @see https://tailwindcss.com/docs/border-color
2001
1799
  */
2002
1800
  'border-color-x': [{
2003
1801
  'border-x': scaleColor()
2004
1802
  }],
2005
1803
  /**
2006
- * Border Color Block
1804
+ * Border Color Y
2007
1805
  * @see https://tailwindcss.com/docs/border-color
2008
1806
  */
2009
1807
  'border-color-y': [{
2010
1808
  'border-y': scaleColor()
2011
1809
  }],
2012
1810
  /**
2013
- * Border Color Inline Start
1811
+ * Border Color S
2014
1812
  * @see https://tailwindcss.com/docs/border-color
2015
1813
  */
2016
1814
  'border-color-s': [{
2017
1815
  'border-s': scaleColor()
2018
1816
  }],
2019
1817
  /**
2020
- * Border Color Inline End
1818
+ * Border Color E
2021
1819
  * @see https://tailwindcss.com/docs/border-color
2022
1820
  */
2023
1821
  'border-color-e': [{
2024
1822
  'border-e': scaleColor()
2025
1823
  }],
2026
- /**
2027
- * Border Color Block Start
2028
- * @see https://tailwindcss.com/docs/border-color
2029
- */
2030
- 'border-color-bs': [{
2031
- 'border-bs': scaleColor()
2032
- }],
2033
- /**
2034
- * Border Color Block End
2035
- * @see https://tailwindcss.com/docs/border-color
2036
- */
2037
- 'border-color-be': [{
2038
- 'border-be': scaleColor()
2039
- }],
2040
1824
  /**
2041
1825
  * Border Color Top
2042
1826
  * @see https://tailwindcss.com/docs/border-color
@@ -2897,47 +2681,33 @@ const getDefaultConfig = () => {
2897
2681
  'scroll-m': scaleUnambiguousSpacing()
2898
2682
  }],
2899
2683
  /**
2900
- * Scroll Margin Inline
2684
+ * Scroll Margin X
2901
2685
  * @see https://tailwindcss.com/docs/scroll-margin
2902
2686
  */
2903
2687
  'scroll-mx': [{
2904
2688
  'scroll-mx': scaleUnambiguousSpacing()
2905
2689
  }],
2906
2690
  /**
2907
- * Scroll Margin Block
2691
+ * Scroll Margin Y
2908
2692
  * @see https://tailwindcss.com/docs/scroll-margin
2909
2693
  */
2910
2694
  'scroll-my': [{
2911
2695
  'scroll-my': scaleUnambiguousSpacing()
2912
2696
  }],
2913
2697
  /**
2914
- * Scroll Margin Inline Start
2698
+ * Scroll Margin Start
2915
2699
  * @see https://tailwindcss.com/docs/scroll-margin
2916
2700
  */
2917
2701
  'scroll-ms': [{
2918
2702
  'scroll-ms': scaleUnambiguousSpacing()
2919
2703
  }],
2920
2704
  /**
2921
- * Scroll Margin Inline End
2705
+ * Scroll Margin End
2922
2706
  * @see https://tailwindcss.com/docs/scroll-margin
2923
2707
  */
2924
2708
  'scroll-me': [{
2925
2709
  'scroll-me': scaleUnambiguousSpacing()
2926
2710
  }],
2927
- /**
2928
- * Scroll Margin Block Start
2929
- * @see https://tailwindcss.com/docs/scroll-margin
2930
- */
2931
- 'scroll-mbs': [{
2932
- 'scroll-mbs': scaleUnambiguousSpacing()
2933
- }],
2934
- /**
2935
- * Scroll Margin Block End
2936
- * @see https://tailwindcss.com/docs/scroll-margin
2937
- */
2938
- 'scroll-mbe': [{
2939
- 'scroll-mbe': scaleUnambiguousSpacing()
2940
- }],
2941
2711
  /**
2942
2712
  * Scroll Margin Top
2943
2713
  * @see https://tailwindcss.com/docs/scroll-margin
@@ -2974,47 +2744,33 @@ const getDefaultConfig = () => {
2974
2744
  'scroll-p': scaleUnambiguousSpacing()
2975
2745
  }],
2976
2746
  /**
2977
- * Scroll Padding Inline
2747
+ * Scroll Padding X
2978
2748
  * @see https://tailwindcss.com/docs/scroll-padding
2979
2749
  */
2980
2750
  'scroll-px': [{
2981
2751
  'scroll-px': scaleUnambiguousSpacing()
2982
2752
  }],
2983
2753
  /**
2984
- * Scroll Padding Block
2754
+ * Scroll Padding Y
2985
2755
  * @see https://tailwindcss.com/docs/scroll-padding
2986
2756
  */
2987
2757
  'scroll-py': [{
2988
2758
  'scroll-py': scaleUnambiguousSpacing()
2989
2759
  }],
2990
2760
  /**
2991
- * Scroll Padding Inline Start
2761
+ * Scroll Padding Start
2992
2762
  * @see https://tailwindcss.com/docs/scroll-padding
2993
2763
  */
2994
2764
  'scroll-ps': [{
2995
2765
  'scroll-ps': scaleUnambiguousSpacing()
2996
2766
  }],
2997
2767
  /**
2998
- * Scroll Padding Inline End
2768
+ * Scroll Padding End
2999
2769
  * @see https://tailwindcss.com/docs/scroll-padding
3000
2770
  */
3001
2771
  'scroll-pe': [{
3002
2772
  'scroll-pe': scaleUnambiguousSpacing()
3003
2773
  }],
3004
- /**
3005
- * Scroll Padding Block Start
3006
- * @see https://tailwindcss.com/docs/scroll-padding
3007
- */
3008
- 'scroll-pbs': [{
3009
- 'scroll-pbs': scaleUnambiguousSpacing()
3010
- }],
3011
- /**
3012
- * Scroll Padding Block End
3013
- * @see https://tailwindcss.com/docs/scroll-padding
3014
- */
3015
- 'scroll-pbe': [{
3016
- 'scroll-pbe': scaleUnambiguousSpacing()
3017
- }],
3018
2774
  /**
3019
2775
  * Scroll Padding Top
3020
2776
  * @see https://tailwindcss.com/docs/scroll-padding
@@ -3149,15 +2905,15 @@ const getDefaultConfig = () => {
3149
2905
  conflictingClassGroups: {
3150
2906
  overflow: ['overflow-x', 'overflow-y'],
3151
2907
  overscroll: ['overscroll-x', 'overscroll-y'],
3152
- inset: ['inset-x', 'inset-y', 'inset-bs', 'inset-be', 'start', 'end', 'top', 'right', 'bottom', 'left'],
2908
+ inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],
3153
2909
  'inset-x': ['right', 'left'],
3154
2910
  'inset-y': ['top', 'bottom'],
3155
2911
  flex: ['basis', 'grow', 'shrink'],
3156
2912
  gap: ['gap-x', 'gap-y'],
3157
- p: ['px', 'py', 'ps', 'pe', 'pbs', 'pbe', 'pt', 'pr', 'pb', 'pl'],
2913
+ p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],
3158
2914
  px: ['pr', 'pl'],
3159
2915
  py: ['pt', 'pb'],
3160
- m: ['mx', 'my', 'ms', 'me', 'mbs', 'mbe', 'mt', 'mr', 'mb', 'ml'],
2916
+ m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],
3161
2917
  mx: ['mr', 'ml'],
3162
2918
  my: ['mt', 'mb'],
3163
2919
  size: ['w', 'h'],
@@ -3177,18 +2933,18 @@ const getDefaultConfig = () => {
3177
2933
  'rounded-b': ['rounded-br', 'rounded-bl'],
3178
2934
  'rounded-l': ['rounded-tl', 'rounded-bl'],
3179
2935
  'border-spacing': ['border-spacing-x', 'border-spacing-y'],
3180
- 'border-w': ['border-w-x', 'border-w-y', 'border-w-s', 'border-w-e', 'border-w-bs', 'border-w-be', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],
2936
+ 'border-w': ['border-w-x', 'border-w-y', 'border-w-s', 'border-w-e', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],
3181
2937
  'border-w-x': ['border-w-r', 'border-w-l'],
3182
2938
  'border-w-y': ['border-w-t', 'border-w-b'],
3183
- 'border-color': ['border-color-x', 'border-color-y', 'border-color-s', 'border-color-e', 'border-color-bs', 'border-color-be', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],
2939
+ 'border-color': ['border-color-x', 'border-color-y', 'border-color-s', 'border-color-e', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],
3184
2940
  'border-color-x': ['border-color-r', 'border-color-l'],
3185
2941
  'border-color-y': ['border-color-t', 'border-color-b'],
3186
2942
  translate: ['translate-x', 'translate-y', 'translate-none'],
3187
2943
  'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],
3188
- 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mbs', 'scroll-mbe', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],
2944
+ 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],
3189
2945
  'scroll-mx': ['scroll-mr', 'scroll-ml'],
3190
2946
  'scroll-my': ['scroll-mt', 'scroll-mb'],
3191
- 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pbs', 'scroll-pbe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],
2947
+ 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],
3192
2948
  'scroll-px': ['scroll-pr', 'scroll-pl'],
3193
2949
  'scroll-py': ['scroll-pt', 'scroll-pb'],
3194
2950
  touch: ['touch-x', 'touch-y', 'touch-pz'],