vida-css 0.0.1 → 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/README.md +58 -0
- package/dist/vida.css +1 -1
- package/package.json +33 -9
- package/scripts/cli.js +38 -0
- package/scripts/generate.js +302 -0
- package/scripts/generator.js +718 -0
- package/scripts/scanner.js +32 -0
- package/vida.config.js +53 -0
package/package.json
CHANGED
|
@@ -1,22 +1,46 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vida-css",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "A lightweight utility CSS library",
|
|
5
|
+
"type": "module",
|
|
5
6
|
"main": "dist/vida.css",
|
|
7
|
+
"style": "dist/vida.css",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"default": "./dist/vida.css"
|
|
11
|
+
},
|
|
12
|
+
"./dist/vida.css": "./dist/vida.css"
|
|
13
|
+
},
|
|
6
14
|
"files": [
|
|
7
|
-
"dist"
|
|
15
|
+
"dist",
|
|
16
|
+
"scripts",
|
|
17
|
+
"vida.config.js"
|
|
8
18
|
],
|
|
9
19
|
"scripts": {
|
|
10
|
-
"
|
|
20
|
+
"generate:jit": "node scripts/generate.js",
|
|
21
|
+
"generate:full": "node scripts/generate.js --full",
|
|
22
|
+
"build": "npm run generate:full && postcss dist/vida.css -o dist/vida.css",
|
|
23
|
+
"prepublishOnly": "npm run build",
|
|
24
|
+
"cli": "node scripts/cli.js"
|
|
25
|
+
},
|
|
26
|
+
"bin": {
|
|
27
|
+
"vida-css": "./scripts/cli.js"
|
|
11
28
|
},
|
|
12
|
-
"keywords": [
|
|
13
|
-
|
|
29
|
+
"keywords": [
|
|
30
|
+
"css",
|
|
31
|
+
"utility",
|
|
32
|
+
"framework"
|
|
33
|
+
],
|
|
34
|
+
"author": "Demilade Oyenuga",
|
|
14
35
|
"license": "MIT",
|
|
15
36
|
"devDependencies": {
|
|
37
|
+
"autoprefixer": "^10.4.0",
|
|
38
|
+
"cssnano": "^6.0.0",
|
|
16
39
|
"postcss": "^8.4.0",
|
|
17
40
|
"postcss-cli": "^10.1.0",
|
|
18
|
-
"postcss-import": "^14.0.2"
|
|
19
|
-
|
|
20
|
-
|
|
41
|
+
"postcss-import": "^14.0.2"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"chokidar": "^5.0.0"
|
|
21
45
|
}
|
|
22
|
-
}
|
|
46
|
+
}
|
package/scripts/cli.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import path from "path";
|
|
3
|
+
import chokidar from "chokidar";
|
|
4
|
+
import fs from "fs";
|
|
5
|
+
import { generateCSS } from "./generator.js";
|
|
6
|
+
import { scanClasses } from "./scanner.js";
|
|
7
|
+
|
|
8
|
+
console.log("🚀 VidaCSS CLI starting...");
|
|
9
|
+
|
|
10
|
+
const projectPath = process.argv[2] || process.cwd();
|
|
11
|
+
|
|
12
|
+
function runBuild() {
|
|
13
|
+
console.log("🔎 Scanning project for classes...");
|
|
14
|
+
const classes = scanClasses(projectPath);
|
|
15
|
+
console.log(`✅ ${classes.length} classes found`);
|
|
16
|
+
|
|
17
|
+
fs.writeFileSync(".vida-classes.json", JSON.stringify(classes,null,2));
|
|
18
|
+
console.log("📦 Class list saved");
|
|
19
|
+
|
|
20
|
+
generateCSS();
|
|
21
|
+
console.log("✅ VidaCSS JIT build complete!");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// First build
|
|
25
|
+
runBuild();
|
|
26
|
+
|
|
27
|
+
// Watch for changes
|
|
28
|
+
console.log("👀 Watching for file changes...");
|
|
29
|
+
const root = projectPath.replace(/\\/g, "/");
|
|
30
|
+
chokidar.watch([`${root}/**/*.{js,jsx,ts,tsx,html}`], {
|
|
31
|
+
// Avoid regenerating on our own outputs / dependencies.
|
|
32
|
+
ignored: [/node_modules/, /(^|[\\/])dist([\\/]|$)/, /\.vida-classes\.json$/],
|
|
33
|
+
persistent: true,
|
|
34
|
+
})
|
|
35
|
+
.on("change", file => {
|
|
36
|
+
console.log(`🔄 File changed: ${file}`);
|
|
37
|
+
runBuild();
|
|
38
|
+
});
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import config from "../vida.config.js";
|
|
4
|
+
import { scanClasses } from "./scanner.js";
|
|
5
|
+
import { generateCSS } from "./generator.js";
|
|
6
|
+
|
|
7
|
+
const args = process.argv.slice(2);
|
|
8
|
+
const fullBuild = args.includes("--full");
|
|
9
|
+
|
|
10
|
+
// Optional argument: project path for JIT scanning.
|
|
11
|
+
const projectArg = args.find(a => !a.startsWith("--"));
|
|
12
|
+
const projectPath = projectArg ? path.resolve(projectArg) : process.cwd();
|
|
13
|
+
|
|
14
|
+
function addToSet(set, value) {
|
|
15
|
+
if (value && typeof value === "string") set.add(value);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function generateAllSupportedBaseUtilities() {
|
|
19
|
+
const baseUtilities = new Set();
|
|
20
|
+
|
|
21
|
+
// Width/Height
|
|
22
|
+
for (const k of Object.keys(config.sizeScale || {})) {
|
|
23
|
+
baseUtilities.add(`w-${k}`);
|
|
24
|
+
baseUtilities.add(`h-${k}`);
|
|
25
|
+
}
|
|
26
|
+
baseUtilities.add("w-full");
|
|
27
|
+
baseUtilities.add("h-full");
|
|
28
|
+
baseUtilities.add("w-screen");
|
|
29
|
+
baseUtilities.add("h-screen");
|
|
30
|
+
baseUtilities.add("min-h-screen");
|
|
31
|
+
baseUtilities.add("min-w-0");
|
|
32
|
+
baseUtilities.add("min-h-0");
|
|
33
|
+
baseUtilities.add("max-w-full");
|
|
34
|
+
baseUtilities.add("min-w-full");
|
|
35
|
+
baseUtilities.add("max-w-1/2");
|
|
36
|
+
baseUtilities.add("min-w-1/2");
|
|
37
|
+
for (const k of Object.keys(config.screens || {})) addToSet(baseUtilities, `max-w-screen-${k}`);
|
|
38
|
+
|
|
39
|
+
// Background colors
|
|
40
|
+
for (const [name, value] of Object.entries(config.colors || {})) {
|
|
41
|
+
if (typeof value === "string") {
|
|
42
|
+
addToSet(baseUtilities, `bg-${name}`);
|
|
43
|
+
} else if (value && typeof value === "object") {
|
|
44
|
+
for (const shade of Object.keys(value)) {
|
|
45
|
+
addToSet(baseUtilities, `bg-${name}-${shade}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
for (const v of ["0","5","10","20","25","30","40","50","60","70","75","80","90","95","100"]) addToSet(baseUtilities, `bg-opacity-${v}`);
|
|
50
|
+
for (const s of ["auto","cover","contain"]) addToSet(baseUtilities, `bg-${s}`);
|
|
51
|
+
for (const p of ["center","top","bottom","left","right"]) addToSet(baseUtilities, `bg-${p}`);
|
|
52
|
+
for (const r of ["repeat","repeat-x","repeat-y","no-repeat"]) addToSet(baseUtilities, `bg-${r}`);
|
|
53
|
+
for (const a of ["fixed","scroll"]) addToSet(baseUtilities, `bg-${a}`);
|
|
54
|
+
|
|
55
|
+
// Text colors
|
|
56
|
+
for (const [name, value] of Object.entries(config.colors || {})) {
|
|
57
|
+
if (typeof value === "string") {
|
|
58
|
+
addToSet(baseUtilities, `text-${name}`);
|
|
59
|
+
} else if (value && typeof value === "object") {
|
|
60
|
+
for (const shade of Object.keys(value)) {
|
|
61
|
+
addToSet(baseUtilities, `text-${name}-${shade}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Gradients
|
|
67
|
+
for (const dir of ["t","tr","r","br","b","bl","l","tl"]) addToSet(baseUtilities, `bg-gradient-to-${dir}`);
|
|
68
|
+
for (const [name, value] of Object.entries(config.colors || {})) {
|
|
69
|
+
if (typeof value === "string") {
|
|
70
|
+
addToSet(baseUtilities, `from-${name}`);
|
|
71
|
+
addToSet(baseUtilities, `via-${name}`);
|
|
72
|
+
addToSet(baseUtilities, `to-${name}`);
|
|
73
|
+
} else if (value && typeof value === "object") {
|
|
74
|
+
for (const shade of Object.keys(value)) {
|
|
75
|
+
addToSet(baseUtilities, `from-${name}-${shade}`);
|
|
76
|
+
addToSet(baseUtilities, `via-${name}-${shade}`);
|
|
77
|
+
addToSet(baseUtilities, `to-${name}-${shade}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Text align
|
|
83
|
+
for (const t of config.textAlign || []) addToSet(baseUtilities, t);
|
|
84
|
+
|
|
85
|
+
// Typography
|
|
86
|
+
for (const s of ["xs","sm","base","lg","xl","2xl","3xl","4xl","5xl","6xl","7xl","8xl","9xl"]) addToSet(baseUtilities, `text-${s}`);
|
|
87
|
+
for (const w of ["light","normal","medium","semibold","bold"]) addToSet(baseUtilities, `font-${w}`);
|
|
88
|
+
for (const f of Object.keys(config.fontFamily || {})) addToSet(baseUtilities, `font-${f}`);
|
|
89
|
+
for (const l of ["none","tight","snug","normal","relaxed","loose"]) addToSet(baseUtilities, `leading-${l}`);
|
|
90
|
+
for (const t of ["tighter","tight","normal","wide","wider","widest"]) addToSet(baseUtilities, `tracking-${t}`);
|
|
91
|
+
for (const t of ["uppercase","lowercase","capitalize","normal-case"]) addToSet(baseUtilities, t);
|
|
92
|
+
for (const t of ["underline","no-underline","truncate"]) addToSet(baseUtilities, t);
|
|
93
|
+
|
|
94
|
+
// Display
|
|
95
|
+
for (const d of ["block","inline-block","inline","hidden"]) addToSet(baseUtilities, d);
|
|
96
|
+
|
|
97
|
+
// Flex / Grid
|
|
98
|
+
for (const f of config.flex || []) addToSet(baseUtilities, f);
|
|
99
|
+
addToSet(baseUtilities, "flex-1");
|
|
100
|
+
for (const fd of config.flexDirection || []) addToSet(baseUtilities, fd);
|
|
101
|
+
// justify/items
|
|
102
|
+
addToSet(baseUtilities, "justify-start");
|
|
103
|
+
addToSet(baseUtilities, "justify-center");
|
|
104
|
+
addToSet(baseUtilities, "justify-end");
|
|
105
|
+
addToSet(baseUtilities, "justify-between");
|
|
106
|
+
addToSet(baseUtilities, "justify-around");
|
|
107
|
+
addToSet(baseUtilities, "justify-evenly");
|
|
108
|
+
addToSet(baseUtilities, "items-start");
|
|
109
|
+
addToSet(baseUtilities, "items-center");
|
|
110
|
+
addToSet(baseUtilities, "items-end");
|
|
111
|
+
addToSet(baseUtilities, "items-stretch");
|
|
112
|
+
|
|
113
|
+
addToSet(baseUtilities, "grid");
|
|
114
|
+
for (const gc of config.grid || []) {
|
|
115
|
+
// config.grid includes "grid" already, but it's harmless to add again.
|
|
116
|
+
addToSet(baseUtilities, gc);
|
|
117
|
+
}
|
|
118
|
+
for (let i = 1; i <= 6; i++) addToSet(baseUtilities, `grid-cols-${i}`);
|
|
119
|
+
for (const gap of Object.keys(config.spacing || {})) addToSet(baseUtilities, `gap-${gap}`);
|
|
120
|
+
|
|
121
|
+
// Overflow
|
|
122
|
+
for (const o of ["hidden","auto","scroll"]) addToSet(baseUtilities, `overflow-${o}`);
|
|
123
|
+
|
|
124
|
+
// Accessibility
|
|
125
|
+
addToSet(baseUtilities, "sr-only");
|
|
126
|
+
addToSet(baseUtilities, "not-sr-only");
|
|
127
|
+
|
|
128
|
+
// Positioning
|
|
129
|
+
for (const p of ["static","relative","absolute","fixed","sticky"]) addToSet(baseUtilities, p);
|
|
130
|
+
|
|
131
|
+
// Offsets (top/left/right/bottom + inset)
|
|
132
|
+
const offsetVals = new Set(["0"]);
|
|
133
|
+
for (const v of Object.keys(config.spacing || {})) offsetVals.add(v);
|
|
134
|
+
for (const v of Object.keys(config.sizeScale || {})) offsetVals.add(v);
|
|
135
|
+
for (const n of offsetVals) {
|
|
136
|
+
addToSet(baseUtilities, `top-${n}`);
|
|
137
|
+
addToSet(baseUtilities, `left-${n}`);
|
|
138
|
+
addToSet(baseUtilities, `right-${n}`);
|
|
139
|
+
addToSet(baseUtilities, `bottom-${n}`);
|
|
140
|
+
addToSet(baseUtilities, `inset-${n}`);
|
|
141
|
+
addToSet(baseUtilities, `inset-x-${n}`);
|
|
142
|
+
addToSet(baseUtilities, `inset-y-${n}`);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Z index (subset)
|
|
146
|
+
for (const z of ["0","10","20","30","40","50","60","70","80","90","100"]) addToSet(baseUtilities, `z-${z}`);
|
|
147
|
+
|
|
148
|
+
// Border radius
|
|
149
|
+
for (const r of ["sm","md","lg"]) addToSet(baseUtilities, `rounded-${r}`);
|
|
150
|
+
|
|
151
|
+
// Borders
|
|
152
|
+
for (const b of ["border","border-0","border-2","border-4"]) addToSet(baseUtilities, b);
|
|
153
|
+
for (const [name, value] of Object.entries(config.colors || {})) {
|
|
154
|
+
if (typeof value === "string") {
|
|
155
|
+
addToSet(baseUtilities, `border-${name}`);
|
|
156
|
+
} else if (value && typeof value === "object") {
|
|
157
|
+
for (const shade of Object.keys(value)) {
|
|
158
|
+
addToSet(baseUtilities, `border-${name}-${shade}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Padding / Margin (subset)
|
|
164
|
+
const spacingVals = new Set(["1/2"]);
|
|
165
|
+
for (const v of Object.keys(config.spacing || {})) spacingVals.add(v);
|
|
166
|
+
for (const v of Object.keys(config.sizeScale || {})) spacingVals.add(v);
|
|
167
|
+
const axes = ["","x","y","t","r","b","l"];
|
|
168
|
+
for (const v of spacingVals) {
|
|
169
|
+
for (const axis of axes) {
|
|
170
|
+
const prefix = axis === "" ? "" : axis;
|
|
171
|
+
if (axis === "") {
|
|
172
|
+
addToSet(baseUtilities, `p-${v}`);
|
|
173
|
+
addToSet(baseUtilities, `m-${v}`);
|
|
174
|
+
} else {
|
|
175
|
+
addToSet(baseUtilities, `p${prefix}-${v}`); // px/py/pt/pr/pb/pl
|
|
176
|
+
addToSet(baseUtilities, `m${prefix}-${v}`); // mx/my/mt/mr/mb/ml
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Shadows
|
|
182
|
+
addToSet(baseUtilities, "shadow-none");
|
|
183
|
+
for (const s of ["sm","md","lg","xl","2xl"]) addToSet(baseUtilities, `shadow-${s}`);
|
|
184
|
+
|
|
185
|
+
// Transitions
|
|
186
|
+
addToSet(baseUtilities, "transition");
|
|
187
|
+
addToSet(baseUtilities, "transition-all");
|
|
188
|
+
addToSet(baseUtilities, "transition-none");
|
|
189
|
+
for (const d of ["75","100","150","200","300","500","700","1000"]) addToSet(baseUtilities, `duration-${d}`);
|
|
190
|
+
for (const d of ["75","100","150","200","300","500"]) addToSet(baseUtilities, `delay-${d}`);
|
|
191
|
+
for (const e of ["linear","in","out","in-out"]) addToSet(baseUtilities, `ease-${e}`);
|
|
192
|
+
|
|
193
|
+
// Animations
|
|
194
|
+
addToSet(baseUtilities, "animate-spin");
|
|
195
|
+
addToSet(baseUtilities, "animate-ping");
|
|
196
|
+
addToSet(baseUtilities, "animate-pulse");
|
|
197
|
+
|
|
198
|
+
// Rings (focus utilities)
|
|
199
|
+
addToSet(baseUtilities, "ring-inset");
|
|
200
|
+
for (const n of ["0","1","2","4"]) addToSet(baseUtilities, `ring-${n}`);
|
|
201
|
+
for (const n of ["0","1","2","4"]) addToSet(baseUtilities, `ring-offset-${n}`);
|
|
202
|
+
// Ring colors (using only 500-shades where present)
|
|
203
|
+
for (const c of ["blue","red","green","yellow","purple"]) addToSet(baseUtilities, `ring-${c}-500`);
|
|
204
|
+
for (const c of ["blue","red","green","yellow","purple"]) addToSet(baseUtilities, `ring-offset-${c}-500`);
|
|
205
|
+
addToSet(baseUtilities, "ring-offset-white");
|
|
206
|
+
|
|
207
|
+
// Transforms
|
|
208
|
+
for (const n of ["0","1","2","4"]) {
|
|
209
|
+
addToSet(baseUtilities, `translate-x-${n}`);
|
|
210
|
+
addToSet(baseUtilities, `translate-y-${n}`);
|
|
211
|
+
}
|
|
212
|
+
for (const d of ["0","1","2","3","6","12","45","90"]) addToSet(baseUtilities, `rotate-${d}`);
|
|
213
|
+
for (const s of ["75","90","95","100","105","110"]) {
|
|
214
|
+
addToSet(baseUtilities, `scale-${s}`);
|
|
215
|
+
addToSet(baseUtilities, `scale-x-${s}`);
|
|
216
|
+
addToSet(baseUtilities, `scale-y-${s}`);
|
|
217
|
+
}
|
|
218
|
+
for (const d of ["0","6","12"]) {
|
|
219
|
+
addToSet(baseUtilities, `skew-x-${d}`);
|
|
220
|
+
addToSet(baseUtilities, `skew-y-${d}`);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Filters
|
|
224
|
+
for (const b of ["0","1","2","3","4"]) addToSet(baseUtilities, `blur-${b}`);
|
|
225
|
+
for (const v of ["50","75","90","100","125","150","200"]) {
|
|
226
|
+
addToSet(baseUtilities, `brightness-${v}`);
|
|
227
|
+
addToSet(baseUtilities, `contrast-${v}`);
|
|
228
|
+
addToSet(baseUtilities, `saturate-${v}`);
|
|
229
|
+
}
|
|
230
|
+
for (const v of ["0","50","100"]) {
|
|
231
|
+
addToSet(baseUtilities, `grayscale-${v}`);
|
|
232
|
+
addToSet(baseUtilities, `sepia-${v}`);
|
|
233
|
+
addToSet(baseUtilities, `invert-${v}`);
|
|
234
|
+
}
|
|
235
|
+
for (const v of ["0","5","10","20","25","30","40","50","60","70","75","80","90","95","100"]) addToSet(baseUtilities, `opacity-${v}`);
|
|
236
|
+
for (const v of ["0","15","30","45"]) addToSet(baseUtilities, `hue-rotate-${v}`);
|
|
237
|
+
addToSet(baseUtilities, "filter-none");
|
|
238
|
+
|
|
239
|
+
// Pseudo-elements (subset used for marketing/demo)
|
|
240
|
+
for (const util of ["absolute","relative"]) addToSet(baseUtilities, `before:${util}`);
|
|
241
|
+
addToSet(baseUtilities, `before:content-['']`);
|
|
242
|
+
addToSet(baseUtilities, `before:content-['•']`);
|
|
243
|
+
for (const n of ["0","1","2","3","4"]) {
|
|
244
|
+
addToSet(baseUtilities, `before:top-${n}`);
|
|
245
|
+
addToSet(baseUtilities, `before:left-${n}`);
|
|
246
|
+
addToSet(baseUtilities, `before:inset-${n}`);
|
|
247
|
+
}
|
|
248
|
+
for (const c of ["blue-500","red-500","purple-500","yellow-500"]) addToSet(baseUtilities, `before:bg-${c}`);
|
|
249
|
+
for (const r of ["sm","md","lg"]) addToSet(baseUtilities, `before:rounded-${r}`);
|
|
250
|
+
addToSet(baseUtilities, "before:w-10");
|
|
251
|
+
addToSet(baseUtilities, "before:h-10");
|
|
252
|
+
|
|
253
|
+
return baseUtilities;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function generateAllClassesFromBase(baseUtilities) {
|
|
257
|
+
const classes = new Set();
|
|
258
|
+
|
|
259
|
+
const screens = Object.keys(config.screens || {});
|
|
260
|
+
const pseudos = ["hover","focus","focus-visible","active","disabled","visited"];
|
|
261
|
+
|
|
262
|
+
function withVariants(util) {
|
|
263
|
+
addToSet(classes, util);
|
|
264
|
+
|
|
265
|
+
// Responsive
|
|
266
|
+
for (const bp of screens) addToSet(classes, `${bp}:${util}`);
|
|
267
|
+
|
|
268
|
+
// Pseudo-class variants
|
|
269
|
+
for (const p of pseudos) addToSet(classes, `${p}:${util}`);
|
|
270
|
+
|
|
271
|
+
// Dark mode (class-based)
|
|
272
|
+
addToSet(classes, `dark:${util}`);
|
|
273
|
+
|
|
274
|
+
// Responsive + pseudo variants (md:hover:...)
|
|
275
|
+
for (const bp of screens) {
|
|
276
|
+
for (const p of pseudos) addToSet(classes, `${bp}:${p}:${util}`);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Dark + pseudo variants (dark:hover:...)
|
|
280
|
+
for (const p of pseudos) addToSet(classes, `dark:${p}:${util}`);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
baseUtilities.forEach(util => withVariants(util));
|
|
284
|
+
return Array.from(classes);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
const classFile = path.join(process.cwd(), ".vida-classes.json");
|
|
288
|
+
|
|
289
|
+
let classes;
|
|
290
|
+
if (fullBuild) {
|
|
291
|
+
const baseUtilities = generateAllSupportedBaseUtilities();
|
|
292
|
+
classes = generateAllClassesFromBase(baseUtilities);
|
|
293
|
+
console.log(`✅ Full build: ${baseUtilities.size} base utilities -> ${classes.length} classes`);
|
|
294
|
+
} else {
|
|
295
|
+
classes = scanClasses(projectPath);
|
|
296
|
+
console.log(`✅ JIT build: ${classes.length} classes found`);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
fs.writeFileSync(classFile, JSON.stringify(classes, null, 2));
|
|
300
|
+
console.log("📦 Class list saved");
|
|
301
|
+
generateCSS();
|
|
302
|
+
|