simplestyle-js 6.0.0 → 6.1.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.
@@ -1,5 +1,5 @@
1
1
  import type { CreateStylesOptions, SimpleStyleRules } from './types.js';
2
- export declare function execCreateStyles<T extends SimpleStyleRules, K extends keyof T, O extends Record<K, string>>(ruleId: string, rules: T, options: CreateStylesOptions, parentSelector: string | null, noGenerateClassName?: boolean): {
2
+ export declare function execCreateStyles<T extends SimpleStyleRules, K extends keyof T, O extends Record<K, string>>(ruleId: string, rules: T, options: CreateStylesOptions, parentSelector: string | null, noGenerateClassName?: boolean, inMediaOrContainerQuery?: boolean): {
3
3
  classes: O;
4
4
  sheetBuffer: string;
5
5
  mediaQueriesBuffer: string;
@@ -1,6 +1,6 @@
1
1
  import { generateClassName } from './generateClassName.mjs';
2
- import { formatCSSRules, isMedia, isNestedSelector } from './utils.mjs';
3
- export function execCreateStyles(ruleId, rules, options, parentSelector, noGenerateClassName = false) {
2
+ import { formatCSSRules, isMediaOrContainer, isNestedSelector } from './utils.mjs';
3
+ export function execCreateStyles(ruleId, rules, options, parentSelector, noGenerateClassName = false, inMediaOrContainerQuery = false) {
4
4
  const out = {};
5
5
  let sheetBuffer = '';
6
6
  let mediaQueriesBuffer = '';
@@ -12,11 +12,15 @@ export function execCreateStyles(ruleId, rules, options, parentSelector, noGener
12
12
  };
13
13
  for (const [classNameOrCSSRule, classNameRules] of styleEntries){
14
14
  // if the classNameRules is a string, we are dealing with a display: none; type rule
15
- if (isMedia(classNameOrCSSRule)) {
16
- if (typeof classNameRules !== 'object') throw new Error('Unable to map @media query because rules / props are an invalid type');
15
+ if (isMediaOrContainer(classNameOrCSSRule)) {
16
+ if (typeof classNameRules !== 'object') throw new Error('Unable to map @media or @container query because rules / props are an invalid type');
17
+ // Check for nested @media/@container queries (CSS spec doesn't allow this)
18
+ if (inMediaOrContainerQuery) {
19
+ throw new Error(`Nested @media or @container queries are not allowed in CSS. Found "${classNameOrCSSRule}" inside another query.`);
20
+ }
17
21
  guardCloseRuleWrite();
18
22
  mediaQueriesBuffer += `${classNameOrCSSRule}{`;
19
- const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(ruleId, classNameRules, options, parentSelector);
23
+ const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(ruleId, classNameRules, options, parentSelector, noGenerateClassName, true);
20
24
  mediaQueriesBuffer += regularOutput;
21
25
  mediaQueriesBuffer += '}';
22
26
  mediaQueriesBuffer += mediaQueriesOutput;
@@ -26,7 +30,7 @@ export function execCreateStyles(ruleId, rules, options, parentSelector, noGener
26
30
  // format of { '& > span': { display: 'none' } } (or further nesting)
27
31
  const replaced = classNameOrCSSRule.replaceAll('&', parentSelector);
28
32
  for (const selector of replaced.split(/,\s*/)){
29
- const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(ruleId, classNameRules, options, selector);
33
+ const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(ruleId, classNameRules, options, selector, noGenerateClassName, inMediaOrContainerQuery);
30
34
  sheetBuffer += regularOutput;
31
35
  mediaQueriesBuffer += mediaQueriesOutput;
32
36
  }
@@ -36,7 +40,7 @@ export function execCreateStyles(ruleId, rules, options, parentSelector, noGener
36
40
  // @ts-expect-error - yes, we can index this object here, so be quiet
37
41
  out[classNameOrCSSRule] = generated;
38
42
  const generatedSelector = `${noGenerateClassName ? '' : '.'}${generated}`;
39
- const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(ruleId, classNameRules, options, generatedSelector);
43
+ const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(ruleId, classNameRules, options, generatedSelector, noGenerateClassName, inMediaOrContainerQuery);
40
44
  sheetBuffer += regularOutput;
41
45
  mediaQueriesBuffer += mediaQueriesOutput;
42
46
  } else {
@@ -1,5 +1,5 @@
1
1
  import type { Properties } from 'csstype';
2
2
  export declare function isNestedSelector(r: string): boolean;
3
- export declare function isMedia(r: string): boolean;
3
+ export declare function isMediaOrContainer(r: string): boolean;
4
4
  export declare function formatCSSRuleName(rule: string): string;
5
5
  export declare function formatCSSRules(cssRules: Properties): string;
@@ -1,8 +1,9 @@
1
1
  export function isNestedSelector(r) {
2
2
  return /&/g.test(r);
3
3
  }
4
- export function isMedia(r) {
5
- return r.toLowerCase().startsWith('@media');
4
+ export function isMediaOrContainer(r) {
5
+ const query = r.toLowerCase();
6
+ return query.startsWith('@media') || query.startsWith('@container');
6
7
  }
7
8
  export function formatCSSRuleName(rule) {
8
9
  return rule.replaceAll(/([A-Z])/g, (p1)=>`-${p1.toLowerCase()}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "simplestyle-js",
3
- "version": "6.0.0",
3
+ "version": "6.1.0",
4
4
  "description": "An incredibly straightforward and simple CSS-in-JS solution with zero runtime dependencies, and out-of-the-box TypeScript support",
5
5
  "type": "module",
6
6
  "bin": {