@melcanz85/chaincss 1.5.2 → 1.5.4
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/README.md +160 -54
- package/chaincss.js +5 -6
- package/package.json +1 -1
- package/transpiler.js +1 -1
package/README.md
CHANGED
|
@@ -1,57 +1,163 @@
|
|
|
1
1
|
# @melcanz85/chaincss
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A simple JavaScript-to-CSS transpiler that converts JS objects into optimized CSS.
|
|
4
|
+
|
|
5
|
+
## 🚀 Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @melcanz85/chaincss
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 📦 Usage (Node.js)
|
|
12
|
+
|
|
13
|
+
### Quick Setup
|
|
14
|
+
|
|
15
|
+
1. **Install development dependencies:**
|
|
16
|
+
```bash
|
|
17
|
+
npm install --save-dev nodemon concurrently
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
2. **Update your `package.json` scripts:**
|
|
21
|
+
```json
|
|
22
|
+
"scripts": {
|
|
23
|
+
"start": "concurrently \"nodemon server.js\" \"nodemon --watch chaincss/*.jcss --watch processor.js --exec 'node processor.js'\""
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Project Structure
|
|
28
|
+
|
|
29
|
+
Create this folder structure in your project:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
your-project/
|
|
33
|
+
├── chaincss/ # ChainCSS source files
|
|
34
|
+
│ ├── chaincss.jcss # Main entry file
|
|
35
|
+
│ ├── chain.jcss # Chaining definitions
|
|
36
|
+
│ └── processor.js # Processing script
|
|
37
|
+
├── public/ # Output files
|
|
38
|
+
│ ├── index.html
|
|
39
|
+
│ └── chainstyle.css # Generated CSS
|
|
40
|
+
├── node_modules/
|
|
41
|
+
├── package.json
|
|
42
|
+
└── package-lock.json
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Processor Setup
|
|
46
|
+
|
|
47
|
+
In `chaincss/processor.js`:
|
|
48
|
+
|
|
49
|
+
```javascript
|
|
50
|
+
const jss = require("@melcanz85/chaincss");
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
// Process main file and output CSS
|
|
54
|
+
jss.processJSS('./chaincss/chaincss.jcss', './public/chainstyle.css');
|
|
55
|
+
} catch (err) {
|
|
56
|
+
console.error('Error processing JSS file:', err.stack);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## 💻 Code Examples
|
|
62
|
+
|
|
63
|
+
### Main File (`chaincss/chaincss.jcss`)
|
|
64
|
+
|
|
65
|
+
```javascript
|
|
66
|
+
<@
|
|
67
|
+
// Import chaining definitions
|
|
68
|
+
const style = get('./chain.jcss');
|
|
69
|
+
|
|
70
|
+
// Override specific styles
|
|
71
|
+
style.navA.color = 'red';
|
|
72
|
+
|
|
73
|
+
// Compile to CSS
|
|
74
|
+
compile(style);
|
|
75
|
+
@>
|
|
76
|
+
|
|
77
|
+
@media (max-width: 768px) {
|
|
78
|
+
<@
|
|
79
|
+
run(
|
|
80
|
+
chaincss.flexDirection('column').alignItems('flex-start').block('header'),
|
|
81
|
+
chaincss.order(1).block('.logo'),
|
|
82
|
+
chaincss.order(2).block('.search-bar'),
|
|
83
|
+
chaincss.order(3).block('h1'),
|
|
84
|
+
chaincss.order(5).block('nav'),
|
|
85
|
+
chaincss.order(4).display('flex').width('100%').justifyContent('flex-end').block('.burgerWrapper')
|
|
86
|
+
);
|
|
87
|
+
@>
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Chaining File (`chaincss/chain.jcss`)
|
|
92
|
+
|
|
93
|
+
```javascript
|
|
94
|
+
// Variables for consistent styling
|
|
95
|
+
const bodyBgColor = '#f0f0f0';
|
|
96
|
+
const headerBgColor = '#333';
|
|
97
|
+
const bodyFontFamily = 'Arial, sans-serif';
|
|
98
|
+
const headerAlignItems = 'center';
|
|
99
|
+
const logoHeight = '50px';
|
|
100
|
+
|
|
101
|
+
// Reset browser defaults
|
|
102
|
+
const resetDefaultBrowStyle = chaincss
|
|
103
|
+
.margin('0')
|
|
104
|
+
.padding('0')
|
|
105
|
+
.block('body', 'h1', 'h2', 'h3', 'p', 'ul');
|
|
106
|
+
|
|
107
|
+
// Body styles
|
|
108
|
+
const bodyStyle = chaincss
|
|
109
|
+
.fontFamily(bodyFontFamily)
|
|
110
|
+
.lineHeight('1.6')
|
|
111
|
+
.bgColor(bodyBgColor)
|
|
112
|
+
.block('body');
|
|
113
|
+
|
|
114
|
+
// Header styles
|
|
115
|
+
const header = chaincss
|
|
116
|
+
.display('flex')
|
|
117
|
+
.alignItems(headerAlignItems)
|
|
118
|
+
.justifyContent('space-between')
|
|
119
|
+
.bgColor(headerBgColor)
|
|
120
|
+
.color('#fff')
|
|
121
|
+
.padding('10px 20px')
|
|
122
|
+
.block('header');
|
|
123
|
+
|
|
124
|
+
// Logo
|
|
125
|
+
const logoImgHeight = chaincss
|
|
126
|
+
.height(logoHeight)
|
|
127
|
+
.block('.logo img');
|
|
128
|
+
|
|
129
|
+
module.exports = {
|
|
130
|
+
resetDefaultBrowStyle,
|
|
131
|
+
bodyStyle,
|
|
132
|
+
header,
|
|
133
|
+
logoImgHeight
|
|
134
|
+
};
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## ✨ Features
|
|
138
|
+
|
|
139
|
+
| Status | Feature | Description |
|
|
140
|
+
|--------|---------|-------------|
|
|
141
|
+
| ✅ | Basic JS → CSS | Convert plain JS objects to CSS |
|
|
142
|
+
| 🚧 | Keyframe animations | @keyframes support |
|
|
143
|
+
| 🚧 | Vendor prefixing | Auto-add -webkit-, -moz-, etc. |
|
|
144
|
+
| 🚧 | Source maps | Debug generated CSS |
|
|
145
|
+
| 🚧 | Watch mode | Auto-recompile on file changes |
|
|
146
|
+
|
|
147
|
+
*✅ = Working, 🚧 = Coming soon*
|
|
148
|
+
|
|
149
|
+
## 📝 Notes
|
|
150
|
+
|
|
151
|
+
- CSS syntax can be written directly in `.jcss` files
|
|
152
|
+
- ChainCSS syntax must be wrapped in `<@ @>` delimiters
|
|
153
|
+
- The `get()` function imports chaining definitions from other files
|
|
154
|
+
- Style modifications between `get()` and `compile()` will override existing styles
|
|
155
|
+
|
|
156
|
+
## 👨💻 Contributing
|
|
157
|
+
|
|
158
|
+
Contributions are welcome! Feel free to open issues or submit pull requests.
|
|
159
|
+
|
|
160
|
+
## 📄 License
|
|
161
|
+
|
|
162
|
+
MIT © Rommel Caneos
|
|
4
163
|
|
|
5
|
-
## 🚀 Installation
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install @melcanz85/chaincss
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
📦 Usage (Node.js)
|
|
12
|
-
|
|
13
|
-
const chaincss = require('@melcanz85/chaincss');
|
|
14
|
-
|
|
15
|
-
const css = chaincss({
|
|
16
|
-
body: {
|
|
17
|
-
margin: 0,
|
|
18
|
-
padding: '20px',
|
|
19
|
-
backgroundColor: '#f0f0f0'
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
console.log(css);
|
|
24
|
-
// Output: body { margin: 0; padding: 20px; background-color: #f0f0f0; }
|
|
25
|
-
|
|
26
|
-
🖥️ Usage (CLI)
|
|
27
|
-
|
|
28
|
-
# Convert JS file to CSS
|
|
29
|
-
npx chaincss input.js output.css
|
|
30
|
-
|
|
31
|
-
# Watch mode (auto-recompile on changes)
|
|
32
|
-
npx chaincss input.js output.css --watch
|
|
33
|
-
|
|
34
|
-
✨ Features
|
|
35
|
-
|
|
36
|
-
Status Feature Description
|
|
37
|
-
✅ Basic JS → CSS Convert plain JS objects to CSS
|
|
38
|
-
|
|
39
|
-
🚧 Nested selectors Support for parent { child {} } syntax
|
|
40
|
-
|
|
41
|
-
🚧 Media queries @media rule support
|
|
42
|
-
|
|
43
|
-
🚧 Keyframe animations @keyframes support
|
|
44
|
-
|
|
45
|
-
🚧 Vendor prefixing Auto-add -webkit-, -moz-, etc.
|
|
46
|
-
|
|
47
|
-
🚧 Source maps Debug generated CSS
|
|
48
|
-
|
|
49
|
-
🚧 Watch mode Auto-recompile on file changes
|
|
50
|
-
|
|
51
|
-
✅ = Working
|
|
52
|
-
🚧 = Coming soon
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
📄 License
|
|
56
|
-
|
|
57
|
-
MIT © Rommel Caneos
|
package/chaincss.js
CHANGED
|
@@ -15,13 +15,12 @@ console.log(__dirname);
|
|
|
15
15
|
const processScript = (scriptBlock) => {
|
|
16
16
|
//const output = 'cssOutput = undefined;';
|
|
17
17
|
const context = vm.createContext({
|
|
18
|
-
...transpilerModule
|
|
18
|
+
...transpilerModule
|
|
19
19
|
});
|
|
20
|
-
|
|
21
|
-
const jsCode = scriptBlock.trim(); //`(function() { ${scriptBlock.trim()} })();`; Wrap script in IIFE
|
|
20
|
+
const jsCode = scriptBlock.trim();
|
|
22
21
|
const chainScript = new vm.Script(jsCode);
|
|
23
|
-
chainScript.runInContext(context);
|
|
24
|
-
return context.chain.cssOutput;
|
|
22
|
+
chainScript.runInContext(context);
|
|
23
|
+
return context.chain.cssOutput;
|
|
25
24
|
};
|
|
26
25
|
|
|
27
26
|
// CSS Minification Function
|
|
@@ -60,7 +59,7 @@ const processor = (inputFile, outputFile) => {
|
|
|
60
59
|
const outputDir = path.resolve(outputFile);
|
|
61
60
|
const trimmedCSS = outputCSS.trim();
|
|
62
61
|
const minCSS = minifyCss(trimmedCSS);
|
|
63
|
-
fs.writeFileSync(outputDir, minCSS, 'utf8');
|
|
62
|
+
fs.writeFileSync(outputDir, minCSS, 'utf8');
|
|
64
63
|
};
|
|
65
64
|
|
|
66
65
|
// Watch function
|
package/package.json
CHANGED
package/transpiler.js
CHANGED
|
@@ -193,7 +193,7 @@ const compile = (obj) => {
|
|
|
193
193
|
for (const key in obj) {
|
|
194
194
|
if (obj.hasOwnProperty(key)) {
|
|
195
195
|
const element = obj[key];
|
|
196
|
-
let selectors = element.selectors || [];
|
|
196
|
+
let selectors = element.selectors || [];
|
|
197
197
|
let elementCSS = '';
|
|
198
198
|
|
|
199
199
|
for (let prop in element) {
|