bernova 0.0.2
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/LICENSE +201 -0
- package/README.md +1778 -0
- package/dist/bin/bernova.js +2 -0
- package/dist/bin/buildstyle.js +2 -0
- package/dist/bin/createConfigFile.js +2 -0
- package/dist/bin/declareCssType.js +1 -0
- package/dist/index.js +1 -0
- package/dist/src/app.js +1 -0
- package/dist/src/constants/compilerType.js +1 -0
- package/dist/src/constants/cssAdvancedSelectors.js +1 -0
- package/dist/src/constants/cssProps.js +1 -0
- package/dist/src/constants/cssPseudoClasses.js +1 -0
- package/dist/src/constants/cssPseudoElements.js +1 -0
- package/dist/src/constants/index.js +1 -0
- package/dist/src/constants/resetCss.js +1 -0
- package/dist/src/index.d.ts +31 -0
- package/dist/src/index.js +1 -0
- package/dist/src/lib/compileConfig.js +1 -0
- package/dist/src/lib/compileThemes.js +1 -0
- package/dist/src/lib/copyLocalFonts/copyLocalFonts.utils.js +1 -0
- package/dist/src/lib/copyLocalFonts/generateCssFonts.utils.js +1 -0
- package/dist/src/lib/extractDocFragment/extractDocFragment.utils.js +1 -0
- package/dist/src/lib/fileExists/fileExists.utils.js +1 -0
- package/dist/src/lib/generateBaseCss/generateBaseCss.utils.js +1 -0
- package/dist/src/lib/generateCss/generateCSS.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/advanceselector/advancedSelectorHandler.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/attribute/attributeHandler.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/classnames/formatClassName.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/classnames/handlerRegister.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/cssVars/generateVars.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/dynamicValues/dynamicValues.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/dynamicValues/processDynamic.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/filterGenerateCss.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/foreign/foreignHandler.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/generateCssStyles.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/index.js +1 -0
- package/dist/src/lib/generateCss/helpers/mediaqueries/generateMediaQueries.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/mediaqueries/mediaQueriesHandler.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/other/declareCssType.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/other/generateGlobalStyles.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/pseudo/pseudoHandler.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/rulename/formatRuleName.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/utils/extractValues.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/utils/formattedStatKey.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/utils/index.js +1 -0
- package/dist/src/lib/generateCss/helpers/utils/processCss.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/utils/separateStyles.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/utils/validatePreviouslyExists.utils.js +1 -0
- package/dist/src/lib/generateCssDoc/generateCssDoc.util.js +1 -0
- package/dist/src/lib/generateProvider/generateProvider.utils.js +1 -0
- package/dist/src/lib/generateProvider/template/providerTemplate.d.ts +60 -0
- package/dist/src/lib/generateProvider/template/providerTemplate.js +1 -0
- package/dist/src/lib/generateThemeRegister/generateThemeRegister.utils.js +1 -0
- package/dist/src/lib/generateTools/generateTools.utils.js +1 -0
- package/dist/src/lib/generateTypesTools/generateTypesTools.utils.js +1 -0
- package/dist/src/lib/handlerForeignThemes/handlerForeignThemes.utils.js +1 -0
- package/dist/src/lib/index.js +1 -0
- package/dist/src/lib/processMediaConfig/processMediaConfig.util.js +1 -0
- package/dist/src/lib/readFile/readFile.utils.js +1 -0
- package/dist/src/lib/simplifyName/simplifyName.utils.js +1 -0
- package/dist/src/lib/typingStyles/index.js +1 -0
- package/dist/src/lib/typingStyles/typingStyles.utils.js +1 -0
- package/dist/src/lib/writeDoc/writeDoc.utils.js +1 -0
- package/package.json +80 -0
- package/src/app.js +176 -0
- package/src/constants/__tests__/compilerType.test.js +20 -0
- package/src/constants/__tests__/cssAdvancedSelectors.test.js +38 -0
- package/src/constants/__tests__/cssProps.test.js +331 -0
- package/src/constants/__tests__/cssPseudoClasses.test.js +48 -0
- package/src/constants/compilerType.js +14 -0
- package/src/constants/cssAdvancedSelectors.js +32 -0
- package/src/constants/cssProps.js +325 -0
- package/src/constants/cssPseudoClasses.js +138 -0
- package/src/constants/cssPseudoElements.js +83 -0
- package/src/constants/index.js +15 -0
- package/src/constants/resetCss.js +171 -0
- package/src/index.d.ts +31 -0
- package/src/index.js +20 -0
- package/src/lib/compileConfig.js +59 -0
- package/src/lib/compileThemes.js +118 -0
- package/src/lib/copyLocalFonts/copyLocalFonts.utils.js +42 -0
- package/src/lib/copyLocalFonts/generateCssFonts.utils.js +56 -0
- package/src/lib/extractDocFragment/extractDocFragment.utils.js +25 -0
- package/src/lib/fileExists/fileExists.utils.js +31 -0
- package/src/lib/generateBaseCss/generateBaseCss.utils.js +51 -0
- package/src/lib/generateCss/generateCSS.utils.js +42 -0
- package/src/lib/generateCss/helpers/advanceselector/advancedSelectorHandler.utils.js +22 -0
- package/src/lib/generateCss/helpers/attribute/attributeHandler.utils.js +47 -0
- package/src/lib/generateCss/helpers/classnames/formatClassName.utils.js +28 -0
- package/src/lib/generateCss/helpers/classnames/handlerRegister.utils.js +124 -0
- package/src/lib/generateCss/helpers/cssVars/generateVars.utils.js +73 -0
- package/src/lib/generateCss/helpers/dynamicValues/dynamicValues.utils.js +72 -0
- package/src/lib/generateCss/helpers/dynamicValues/processDynamic.utils.js +10 -0
- package/src/lib/generateCss/helpers/filterGenerateCss.utils.js +73 -0
- package/src/lib/generateCss/helpers/foreign/foreignHandler.utils.js +85 -0
- package/src/lib/generateCss/helpers/generateCssStyles.utils.js +249 -0
- package/src/lib/generateCss/helpers/index.js +53 -0
- package/src/lib/generateCss/helpers/mediaqueries/generateMediaQueries.utils.js +9 -0
- package/src/lib/generateCss/helpers/mediaqueries/mediaQueriesHandler.utils.js +181 -0
- package/src/lib/generateCss/helpers/other/declareCssType.utils.js +120 -0
- package/src/lib/generateCss/helpers/other/generateGlobalStyles.utils.js +30 -0
- package/src/lib/generateCss/helpers/pseudo/pseudoHandler.utils.js +56 -0
- package/src/lib/generateCss/helpers/rulename/formatRuleName.utils.js +163 -0
- package/src/lib/generateCss/helpers/utils/extractValues.utils.js +44 -0
- package/src/lib/generateCss/helpers/utils/formattedStatKey.utils.js +43 -0
- package/src/lib/generateCss/helpers/utils/index.js +15 -0
- package/src/lib/generateCss/helpers/utils/processCss.utils.js +93 -0
- package/src/lib/generateCss/helpers/utils/separateStyles.utils.js +43 -0
- package/src/lib/generateCss/helpers/utils/validatePreviouslyExists.utils.js +61 -0
- package/src/lib/generateCssDoc/generateCssDoc.util.js +47 -0
- package/src/lib/generateProvider/generateProvider.utils.js +283 -0
- package/src/lib/generateProvider/template/providerTemplate.d.ts +60 -0
- package/src/lib/generateProvider/template/providerTemplate.js +160 -0
- package/src/lib/generateThemeRegister/generateThemeRegister.utils.js +136 -0
- package/src/lib/generateTools/generateTools.utils.js +181 -0
- package/src/lib/generateTypesTools/generateTypesTools.utils.js +59 -0
- package/src/lib/handlerForeignThemes/handlerForeignThemes.utils.js +96 -0
- package/src/lib/index.js +61 -0
- package/src/lib/processMediaConfig/processMediaConfig.util.js +32 -0
- package/src/lib/readFile/readFile.utils.js +110 -0
- package/src/lib/simplifyName/__tests__/simplifyName.utils.test.js +87 -0
- package/src/lib/simplifyName/simplifyName.utils.js +28 -0
- package/src/lib/typingStyles/index.js +3 -0
- package/src/lib/typingStyles/typingStyles.utils.js +144 -0
- package/src/lib/writeDoc/writeDoc.utils.js +30 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSS Rule Name Formatter for Bernova CSS Framework
|
|
3
|
+
*
|
|
4
|
+
* Handles CSS class name generation, registration, and formatting.
|
|
5
|
+
* Manages component-variant relationships and maintains class name registry.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { formattedStatKey } = require('../utils');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Registers component and variant information in the CSS class registry
|
|
12
|
+
* Manages hierarchical component structure with variants and base classes
|
|
13
|
+
*
|
|
14
|
+
* @param {Object} register - CSS class registry to update
|
|
15
|
+
* @param {string} component - Component name to register
|
|
16
|
+
* @param {string} variant - Optional variant name for the component
|
|
17
|
+
* @param {string} mainComponent - Main parent component name
|
|
18
|
+
* @param {boolean} hasStyles - Whether component has actual CSS styles
|
|
19
|
+
* @param {string} prefix - CSS class prefix for namespacing
|
|
20
|
+
*/
|
|
21
|
+
const setRegister = ({
|
|
22
|
+
register,
|
|
23
|
+
component,
|
|
24
|
+
variant,
|
|
25
|
+
mainComponent,
|
|
26
|
+
hasStyles,
|
|
27
|
+
prefix,
|
|
28
|
+
}) => {
|
|
29
|
+
// Initialize main component in register if not exists
|
|
30
|
+
if (!(mainComponent in register)) {
|
|
31
|
+
register[mainComponent] = {};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Register base component (only if it has styles)
|
|
35
|
+
if (!(component in register[mainComponent])) {
|
|
36
|
+
register[mainComponent][component] = !!hasStyles && `${prefix}${component}`;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Handle variant registration
|
|
40
|
+
if (!!variant) {
|
|
41
|
+
const v = `$_${formattedStatKey(variant)}`;
|
|
42
|
+
|
|
43
|
+
// Initialize variant section
|
|
44
|
+
if (!(v in register[mainComponent])) {
|
|
45
|
+
register[mainComponent][v] = {};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Register component with variant
|
|
49
|
+
if (!(component in register[mainComponent][v])) {
|
|
50
|
+
const regWithoutVariant = !!register[mainComponent][component];
|
|
51
|
+
register[mainComponent][v][component] = regWithoutVariant
|
|
52
|
+
? `${prefix}${component} ${prefix}${component}--${variant}` // Base + variant classes
|
|
53
|
+
: `${prefix}${component}--${variant}`; // Variant only
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const getRuleNameSlices = ({ parentRule, key, prefix }) => {
|
|
59
|
+
//? extract the component from the parentRule
|
|
60
|
+
const [mainComponent, rest] = parentRule.split('--');
|
|
61
|
+
//? format the key to lower case and remove any brackets
|
|
62
|
+
const variant = rest && rest.length && rest.replace(/\[.*?\]/g, '');
|
|
63
|
+
//? format the key to lower case
|
|
64
|
+
const lowerKey = !!key && key.length && key.toLocaleLowerCase();
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
mainComponent,
|
|
68
|
+
variant,
|
|
69
|
+
lowerKey,
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const setForeignRegister = ({ ruleName, foreignRegister, register }) => {
|
|
74
|
+
const { mainComponent, variant } = getRuleNameSlices({
|
|
75
|
+
parentRule: ruleName,
|
|
76
|
+
});
|
|
77
|
+
if (!(mainComponent in register)) {
|
|
78
|
+
register[mainComponent] = {};
|
|
79
|
+
}
|
|
80
|
+
if (!!variant) {
|
|
81
|
+
const v = `$_${formattedStatKey(variant)}`;
|
|
82
|
+
if (!(v in register[mainComponent])) {
|
|
83
|
+
register[mainComponent][v] = {};
|
|
84
|
+
}
|
|
85
|
+
register[mainComponent][v] = {
|
|
86
|
+
...register[mainComponent][v],
|
|
87
|
+
...foreignRegister,
|
|
88
|
+
};
|
|
89
|
+
} else {
|
|
90
|
+
register[mainComponent] = {
|
|
91
|
+
...register[mainComponent],
|
|
92
|
+
...foreignRegister,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const formatRuleName = ({
|
|
98
|
+
key = '',
|
|
99
|
+
parentRule,
|
|
100
|
+
theRule,
|
|
101
|
+
hasStyles,
|
|
102
|
+
prefix,
|
|
103
|
+
register = {},
|
|
104
|
+
}) => {
|
|
105
|
+
let className = '';
|
|
106
|
+
// Use theRule directly if provided (for pseudo-classes, selectors, etc.)
|
|
107
|
+
if (theRule) {
|
|
108
|
+
className = theRule;
|
|
109
|
+
|
|
110
|
+
// Generate base className from key if no parent rule exists
|
|
111
|
+
} else if (!parentRule) {
|
|
112
|
+
const cleanKey = key.toLocaleLowerCase().replace(/\[.*?\]/g, '');
|
|
113
|
+
className = `${prefix}${cleanKey}`;
|
|
114
|
+
|
|
115
|
+
if (key.length) {
|
|
116
|
+
setRegister({
|
|
117
|
+
register,
|
|
118
|
+
component: cleanKey,
|
|
119
|
+
mainComponent: cleanKey,
|
|
120
|
+
hasStyles,
|
|
121
|
+
prefix,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
} else {
|
|
125
|
+
// Handle component with parent rule (nested components, variants)
|
|
126
|
+
const { mainComponent, variant, lowerKey } = getRuleNameSlices({
|
|
127
|
+
parentRule,
|
|
128
|
+
key,
|
|
129
|
+
});
|
|
130
|
+
const componentRegistered = mainComponent.replace(prefix, '');
|
|
131
|
+
const keyTarget = key.startsWith('_');
|
|
132
|
+
|
|
133
|
+
if (keyTarget) {
|
|
134
|
+
className = !!variant
|
|
135
|
+
? `${mainComponent}_${lowerKey}--${variant}`
|
|
136
|
+
: `${mainComponent}_${lowerKey}`;
|
|
137
|
+
|
|
138
|
+
setRegister({
|
|
139
|
+
register,
|
|
140
|
+
mainComponent: componentRegistered,
|
|
141
|
+
component: `${componentRegistered}_${lowerKey}`,
|
|
142
|
+
variant,
|
|
143
|
+
hasStyles,
|
|
144
|
+
prefix,
|
|
145
|
+
});
|
|
146
|
+
} else if (lowerKey) {
|
|
147
|
+
className = `${mainComponent}--${lowerKey}`;
|
|
148
|
+
|
|
149
|
+
setRegister({
|
|
150
|
+
register,
|
|
151
|
+
mainComponent: componentRegistered,
|
|
152
|
+
component: componentRegistered,
|
|
153
|
+
variant: lowerKey,
|
|
154
|
+
hasStyles,
|
|
155
|
+
prefix,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return className;
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
module.exports = { formatRuleName, setForeignRegister };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const { cssProps } = require('../../../../constants/cssProps.js');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Extracts CSS values from an object and formats them as CSS properties.
|
|
5
|
+
* Accepts both real CSS properties and custom properties defined in cssProps.
|
|
6
|
+
*
|
|
7
|
+
* @param {Object} styles - The object containing CSS values.
|
|
8
|
+
* @returns {string} The formatted CSS properties.
|
|
9
|
+
*/
|
|
10
|
+
const extractValues = ({ styles, dynamicValues }) => {
|
|
11
|
+
return Object.entries(styles)
|
|
12
|
+
.filter(([key]) => cssProps[key])
|
|
13
|
+
.map(([key, value]) => {
|
|
14
|
+
//* replace the js key for css property
|
|
15
|
+
const cssProperty = cssProps[key];
|
|
16
|
+
//* handle dynamic values
|
|
17
|
+
//? Count how many times '$' appears in the value
|
|
18
|
+
//? the length is always 1 more than the count of '$', becase the first values is a empty string
|
|
19
|
+
const varsFinded = String(value).split('$').length - 1;
|
|
20
|
+
const validValue = (() => {
|
|
21
|
+
if (!!dynamicValues && varsFinded > 0) {
|
|
22
|
+
return String(value)
|
|
23
|
+
.split(' ')
|
|
24
|
+
.reduce((acc, curr, idx) => {
|
|
25
|
+
if (curr in dynamicValues) {
|
|
26
|
+
if (idx > 0) {
|
|
27
|
+
acc += ' ';
|
|
28
|
+
}
|
|
29
|
+
acc += dynamicValues[curr];
|
|
30
|
+
}
|
|
31
|
+
return acc;
|
|
32
|
+
}, '');
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
})();
|
|
36
|
+
|
|
37
|
+
return cssProperty === cssProps.$content
|
|
38
|
+
? `${cssProperty}: '${validValue}';`
|
|
39
|
+
: `${cssProperty}: ${validValue};`;
|
|
40
|
+
})
|
|
41
|
+
.join(' ');
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
module.exports = { extractValues };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Statistical Key Formatter for Bernova Analytics
|
|
3
|
+
*
|
|
4
|
+
* Normalizes CSS class names and component keys for statistical tracking.
|
|
5
|
+
* Removes special prefixes and standardizes separators to underscores.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Formats a statistical key by normalizing separators and removing prefixes
|
|
10
|
+
* Used for consistent analytics and tracking across the CSS generation process
|
|
11
|
+
*
|
|
12
|
+
* @param {string} key - The key to format and normalize
|
|
13
|
+
* @returns {string} Normalized key with standardized separators
|
|
14
|
+
* @example
|
|
15
|
+
* formattedStatKey('$_component--name') → 'component_name'
|
|
16
|
+
* formattedStatKey('my-class__name') → 'my_class_name'
|
|
17
|
+
*/
|
|
18
|
+
const formattedStatKey = (key) => {
|
|
19
|
+
let k = key;
|
|
20
|
+
|
|
21
|
+
// Remove library-specific prefix
|
|
22
|
+
if (k.includes('$_')) {
|
|
23
|
+
k = k.replace('$_', '');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Normalize all separators to underscores
|
|
27
|
+
if (k.includes(' ', '_')) {
|
|
28
|
+
k = k.replace(' ', '_');
|
|
29
|
+
}
|
|
30
|
+
if (k.includes('__')) {
|
|
31
|
+
k = k.replace('__', '_');
|
|
32
|
+
}
|
|
33
|
+
if (k.includes('--')) {
|
|
34
|
+
k = k.replace('--', '_');
|
|
35
|
+
}
|
|
36
|
+
if (k.includes('-')) {
|
|
37
|
+
k = k.replace('-', '_');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return k;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
module.exports = { formattedStatKey };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const { extractValues } = require('./extractValues.utils');
|
|
2
|
+
const { processCssWithPostcss } = require('./processCss.utils');
|
|
3
|
+
const { separateStyles } = require('./separateStyles.utils');
|
|
4
|
+
const {
|
|
5
|
+
validatePreviouslyExists,
|
|
6
|
+
} = require('./validatePreviouslyExists.utils');
|
|
7
|
+
const { formattedStatKey } = require('./formattedStatKey.utils');
|
|
8
|
+
|
|
9
|
+
module.exports = {
|
|
10
|
+
extractValues,
|
|
11
|
+
processCssWithPostcss,
|
|
12
|
+
separateStyles,
|
|
13
|
+
validatePreviouslyExists,
|
|
14
|
+
formattedStatKey,
|
|
15
|
+
};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
const postcss = require('postcss');
|
|
2
|
+
const autoprefixer = require('autoprefixer');
|
|
3
|
+
const cssnano = require('cssnano');
|
|
4
|
+
const postcssPresetEnv = require('postcss-preset-env');
|
|
5
|
+
// const combineMediaQuery = require('postcss-combine-media-query'); // <- this plugin is not used in the provided code
|
|
6
|
+
const fontMagician = require('postcss-font-magician');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Processes CSS with PostCSS using the configuration in postcss.config.js.
|
|
11
|
+
*
|
|
12
|
+
* @param {string} css - The CSS to process.
|
|
13
|
+
* @param {boolean} [minified=false] - Whether to minify the CSS.
|
|
14
|
+
* @param {string} [prefix=''] - The prefix to add to :root and all classes.
|
|
15
|
+
* @param {Object} fonts - The fonts configuration.
|
|
16
|
+
* @returns {Promise<string>} The processed CSS.
|
|
17
|
+
*/
|
|
18
|
+
const processCssWithPostcss = async (
|
|
19
|
+
css,
|
|
20
|
+
minified = false,
|
|
21
|
+
prefix = '',
|
|
22
|
+
fonts = {}
|
|
23
|
+
) => {
|
|
24
|
+
const plugins = [
|
|
25
|
+
postcssPresetEnv({
|
|
26
|
+
stage: 0,
|
|
27
|
+
autoprefixer: { grid: true },
|
|
28
|
+
features: {
|
|
29
|
+
'custom-properties': false, // <- Disable CSS variable resolution
|
|
30
|
+
},
|
|
31
|
+
}),
|
|
32
|
+
autoprefixer({
|
|
33
|
+
overrideBrowserslist: [
|
|
34
|
+
'> 1%',
|
|
35
|
+
'last 2 versions',
|
|
36
|
+
'Firefox ESR',
|
|
37
|
+
'not dead',
|
|
38
|
+
],
|
|
39
|
+
}),
|
|
40
|
+
// combineMediaQuery,
|
|
41
|
+
fontMagician({
|
|
42
|
+
variants: fonts?.google?.reduce((acc, font) => {
|
|
43
|
+
acc[font.name] = font.weights.reduce((weights, weight) => {
|
|
44
|
+
weights[weight] = [];
|
|
45
|
+
return weights;
|
|
46
|
+
}, {});
|
|
47
|
+
return acc;
|
|
48
|
+
}, {}),
|
|
49
|
+
foundries: ['google', 'local'],
|
|
50
|
+
custom: fonts?.local?.reduce((acc, font) => {
|
|
51
|
+
acc[font.name] = {
|
|
52
|
+
variants: Object.keys(font.files).reduce((variants, weight) => {
|
|
53
|
+
variants[weight] = {
|
|
54
|
+
normal: {
|
|
55
|
+
url: {
|
|
56
|
+
ttf: path.join('fonts', path.basename(font.files[weight])),
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
return variants;
|
|
61
|
+
}, {}),
|
|
62
|
+
};
|
|
63
|
+
return acc;
|
|
64
|
+
}, {}),
|
|
65
|
+
}),
|
|
66
|
+
];
|
|
67
|
+
|
|
68
|
+
if (minified) {
|
|
69
|
+
plugins.push(
|
|
70
|
+
cssnano({
|
|
71
|
+
preset: 'default',
|
|
72
|
+
})
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (prefix) {
|
|
77
|
+
css = css.replace(/:root/g, `[data-theme='${prefix}']`);
|
|
78
|
+
css = css.replace(/\.([a-zA-Z_][\w-]*)/g, (match, p1) => {
|
|
79
|
+
if (css.includes(`@font-face`) || css.includes(`@import`)) {
|
|
80
|
+
return match;
|
|
81
|
+
}
|
|
82
|
+
return `[data-theme='${prefix}'] .${p1}`;
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const result = await postcss(plugins).process(css, {
|
|
87
|
+
from: undefined,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
return result.css;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
module.exports = { processCssWithPostcss };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Style Separation Utility for Bernova CSS Framework
|
|
3
|
+
*
|
|
4
|
+
* Separates CSS object properties into different categories:
|
|
5
|
+
* - Standard CSS properties (styles)
|
|
6
|
+
* - Library-specific properties (lib) - starting with $
|
|
7
|
+
* - Other properties (nested objects, pseudo-classes, etc.)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const { cssProps } = require('../../../../constants/index.js');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Separates a CSS object into different property categories
|
|
14
|
+
*
|
|
15
|
+
* @param {Object} css - CSS object to categorize
|
|
16
|
+
* @returns {Object} Separated properties: { styles, lib, other }
|
|
17
|
+
* @example
|
|
18
|
+
* separateStyles({
|
|
19
|
+
* color: 'red', // → styles
|
|
20
|
+
* $dynamic: 'value', // → lib
|
|
21
|
+
* hover: { color: 'blue' } // → other
|
|
22
|
+
* })
|
|
23
|
+
*/
|
|
24
|
+
const separateStyles = (css) => {
|
|
25
|
+
const styles = {}; // Standard CSS properties
|
|
26
|
+
const other = {}; // Nested objects (pseudo-classes, selectors, etc.)
|
|
27
|
+
const lib = {}; // Library-specific properties (starting with $)
|
|
28
|
+
|
|
29
|
+
// Categorize each property based on its type and prefix
|
|
30
|
+
Object.entries(css).forEach(([key, value]) => {
|
|
31
|
+
if (key in cssProps) {
|
|
32
|
+
styles[key] = value; // Standard CSS properties
|
|
33
|
+
} else if (key.startsWith('$') && !!value) {
|
|
34
|
+
lib[key] = value; // Library-specific properties
|
|
35
|
+
} else {
|
|
36
|
+
other[key] = value; // Everything else (nested objects)
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
return { styles, lib, other };
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
module.exports = { separateStyles };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSS File Validation Utility for Bernova
|
|
3
|
+
*
|
|
4
|
+
* Validates and handles existing CSS files during compilation.
|
|
5
|
+
* Supports partial compilation by preserving existing sections
|
|
6
|
+
* when generating foundation-only or component-only builds.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const fs = require('fs').promises;
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const { compilerTypeValid } = require('../../../../constants');
|
|
12
|
+
const {
|
|
13
|
+
extractDocFragment,
|
|
14
|
+
} = require('../../../extractDocFragment/extractDocFragment.utils');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Validates if CSS files exist and handles partial compilation preservation
|
|
18
|
+
*
|
|
19
|
+
* @param {Object} params - Validation parameters
|
|
20
|
+
* @param {string} params.stylesDir - Directory where CSS files are stored
|
|
21
|
+
* @param {string} params.compilerType - Type of compilation (full, foundationOnly, componentOnly)
|
|
22
|
+
* @param {string} params.name - Base name for CSS files
|
|
23
|
+
* @returns {Object} Directory paths and existing CSS data
|
|
24
|
+
*/
|
|
25
|
+
const validatePreviouslyExists = async ({ stylesDir, compilerType, name }) => {
|
|
26
|
+
const dirs = {
|
|
27
|
+
cssDir: path.resolve(stylesDir, `${name}.css`),
|
|
28
|
+
cssMinifiedDir: path.resolve(stylesDir, `${name}.min.css`),
|
|
29
|
+
oldData: '',
|
|
30
|
+
};
|
|
31
|
+
try {
|
|
32
|
+
await fs.access(stylesDir);
|
|
33
|
+
try {
|
|
34
|
+
await fs.access(dirs.cssDir);
|
|
35
|
+
if (!compilerType || compilerType === compilerTypeValid.full) {
|
|
36
|
+
return dirs;
|
|
37
|
+
}
|
|
38
|
+
const oldCss = await fs.readFile(dirs.cssDir, 'utf8');
|
|
39
|
+
const section = (() => {
|
|
40
|
+
switch (compilerType) {
|
|
41
|
+
case compilerTypeValid.foundationOnly:
|
|
42
|
+
return 'Components';
|
|
43
|
+
case compilerTypeValid.componentOnly:
|
|
44
|
+
return 'Foundations';
|
|
45
|
+
default:
|
|
46
|
+
return '';
|
|
47
|
+
}
|
|
48
|
+
})();
|
|
49
|
+
dirs.oldData = extractDocFragment({ section, doc: oldCss });
|
|
50
|
+
} catch {
|
|
51
|
+
return dirs;
|
|
52
|
+
}
|
|
53
|
+
} catch {
|
|
54
|
+
await fs.mkdir(stylesDir, { recursive: true });
|
|
55
|
+
return dirs;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return dirs;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
module.exports = { validatePreviouslyExists };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSS Documentation Generator for Bernova
|
|
3
|
+
*
|
|
4
|
+
* Combines foundation and component CSS into a single document with proper
|
|
5
|
+
* sectioning and comments. Handles different compilation modes and preserves
|
|
6
|
+
* existing data when doing partial compilation.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const { compilerTypeValid } = require('../../constants');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Generates final CSS document by combining foundations and components
|
|
13
|
+
* Adds section comments and handles partial compilation modes
|
|
14
|
+
*
|
|
15
|
+
* @param {Object} params - Generation parameters
|
|
16
|
+
* @param {string} params.compilerType - Type of compilation being performed
|
|
17
|
+
* @param {string} params.stylesCss - Generated component/theme CSS
|
|
18
|
+
* @param {string} params.foundationsCss - Generated foundation CSS (variables, reset)
|
|
19
|
+
* @param {string} params.oldData - Existing CSS data to preserve (optional)
|
|
20
|
+
* @returns {string} Complete CSS document with sections and comments
|
|
21
|
+
*/
|
|
22
|
+
const generateCssDoc = ({
|
|
23
|
+
compilerType,
|
|
24
|
+
stylesCss,
|
|
25
|
+
foundationsCss,
|
|
26
|
+
oldData = '',
|
|
27
|
+
}) => {
|
|
28
|
+
// Determine what sections to include based on compilation type
|
|
29
|
+
const createFoundations = compilerType !== compilerTypeValid.componentOnly;
|
|
30
|
+
const createComponents = compilerType !== compilerTypeValid.foundationOnly;
|
|
31
|
+
|
|
32
|
+
// Generate foundations section (CSS variables, reset, base styles)
|
|
33
|
+
const foundations = createFoundations
|
|
34
|
+
? `/* === BERNOVA FOUNDATIONS === */\n${foundationsCss}\n/* === END FOUNDATIONS === */\n\n`
|
|
35
|
+
: oldData;
|
|
36
|
+
|
|
37
|
+
// Generate components section (component styles, utilities, media queries)
|
|
38
|
+
const components = createComponents
|
|
39
|
+
? `/* === BERNOVA COMPONENTS === */\n${stylesCss}\n/* === END COMPONENTS === */\n`
|
|
40
|
+
: oldData;
|
|
41
|
+
|
|
42
|
+
// Combine sections into final CSS document
|
|
43
|
+
const cssDocument = `${foundations}${components}`;
|
|
44
|
+
return cssDocument;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
module.exports = { generateCssDoc };
|