esm-styles 0.3.8 → 0.3.10
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/lib/utils/selector.js +35 -7
- package/package.json +1 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as utils from './cartesian.js';
|
|
2
|
-
import kebabCase from 'lodash/kebabCase.js';
|
|
3
2
|
const svgTags = [
|
|
4
3
|
'circle',
|
|
5
4
|
'ellipse',
|
|
@@ -184,7 +183,15 @@ const processClass = (cls) => {
|
|
|
184
183
|
if (/^[A-Z]/.test(cls)) {
|
|
185
184
|
return cls;
|
|
186
185
|
}
|
|
187
|
-
|
|
186
|
+
// Custom kebab conversion:
|
|
187
|
+
// 1. Handle camelCase (e.g. myClass -> my-Class)
|
|
188
|
+
// 2. Handle snake_case (e.g. my_class -> my-class)
|
|
189
|
+
// 3. Lowercase everything (my-Class -> my-class)
|
|
190
|
+
// We do NOT use lodash/kebabCase because it splits numbers (i1 -> i-1), which is undesirable
|
|
191
|
+
return cls
|
|
192
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1-$2')
|
|
193
|
+
.replace(/_/g, '-')
|
|
194
|
+
.toLowerCase();
|
|
188
195
|
};
|
|
189
196
|
const transformExplicitClasses = (selector) => {
|
|
190
197
|
return selector.replace(/\.([a-zA-Z0-9_-]+)/g, (_, cls) => {
|
|
@@ -203,23 +210,44 @@ export const joinSelectorPath = (path) => {
|
|
|
203
210
|
case part === '*':
|
|
204
211
|
// Universal selector
|
|
205
212
|
return acc + (acc ? ' ' : '') + '*';
|
|
206
|
-
case part.startsWith('__'):
|
|
207
|
-
|
|
213
|
+
case part.startsWith('__'): {
|
|
214
|
+
const content = part.slice(2);
|
|
215
|
+
const match = content.match(/^([a-zA-Z0-9_-]+)(.*)$/);
|
|
216
|
+
let processed = '';
|
|
217
|
+
if (match) {
|
|
218
|
+
processed =
|
|
219
|
+
processClass(match[1]) + transformExplicitClasses(match[2]);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
processed = processClass(content);
|
|
223
|
+
}
|
|
224
|
+
return acc + (acc ? ' ' : '') + '.' + processed;
|
|
225
|
+
}
|
|
208
226
|
case part.startsWith('_'): {
|
|
209
227
|
// Attach class directly to previous part unless prev is combinator or root
|
|
228
|
+
const content = part.slice(1);
|
|
229
|
+
const match = content.match(/^([a-zA-Z0-9_-]+)(.*)$/);
|
|
230
|
+
let processed = '';
|
|
231
|
+
if (match) {
|
|
232
|
+
processed =
|
|
233
|
+
processClass(match[1]) + transformExplicitClasses(match[2]);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
processed = processClass(content);
|
|
237
|
+
}
|
|
210
238
|
const combinators = ['>', '+', '~'];
|
|
211
239
|
const isPrevCombinator = prev && combinators.some((c) => prev.startsWith(c));
|
|
212
240
|
if (isPrevRoot || isPrevCombinator || !acc) {
|
|
213
|
-
return acc + (acc ? ' ' : '') + '.' +
|
|
241
|
+
return acc + (acc ? ' ' : '') + '.' + processed;
|
|
214
242
|
}
|
|
215
243
|
// Attach directly (no space)
|
|
216
|
-
return acc + '.' +
|
|
244
|
+
return acc + '.' + processed;
|
|
217
245
|
}
|
|
218
246
|
case part.startsWith('>') ||
|
|
219
247
|
part.startsWith('+') ||
|
|
220
248
|
part.startsWith('~'):
|
|
221
249
|
// Combinators: always join with a space
|
|
222
|
-
return acc + ' ' + part;
|
|
250
|
+
return acc + ' ' + transformExplicitClasses(part);
|
|
223
251
|
case part.startsWith(':') ||
|
|
224
252
|
part.startsWith('::') ||
|
|
225
253
|
part.startsWith('#') ||
|