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.
@@ -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
- return kebabCase(cls);
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
- return acc + (acc ? ' ' : '') + '.' + processClass(part.slice(2));
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 ? ' ' : '') + '.' + processClass(part.slice(1));
241
+ return acc + (acc ? ' ' : '') + '.' + processed;
214
242
  }
215
243
  // Attach directly (no space)
216
- return acc + '.' + processClass(part.slice(1));
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('#') ||
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "esm-styles",
3
- "version": "0.3.8",
3
+ "version": "0.3.10",
4
4
  "description": "A library for working with ESM styles",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",