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/package.json CHANGED
@@ -1,22 +1,46 @@
1
1
  {
2
2
  "name": "vida-css",
3
- "version": "0.0.1",
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
- "build": "postcss src/index.css -o dist/vida.css"
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": ["css", "utility", "framework"],
13
- "author": "Your Name",
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
- "autoprefixer": "^10.4.0",
20
- "cssnano": "^6.0.0"
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
+