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,
|
|
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 (
|
|
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
|
|
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
|
|
5
|
-
|
|
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