tailwind-typescript-plugin 0.0.2-beta.5 → 0.0.2-beta.6

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 CHANGED
@@ -198,6 +198,19 @@ Most editors that support TypeScript Language Service plugins should work automa
198
198
  <p className="p-[20px] text-[14px]">Custom values</p>
199
199
  </div>
200
200
 
201
+ // ✅ CSS variables (Tailwind v3.1+)
202
+ <div
203
+ className="
204
+ [--card-bg:#1e293b]
205
+ [--card-radius:16px]
206
+ bg-[var(--card-bg)]
207
+ rounded-[var(--card-radius)]
208
+ p-4
209
+ "
210
+ >
211
+ CSS custom properties
212
+ </div>
213
+
201
214
  // ✅ Variants (responsive, state, etc.)
202
215
  <div className="hover:bg-blue-500 md:flex lg:grid-cols-3 dark:text-white">
203
216
  Responsive and state variants
@@ -474,6 +487,10 @@ const invalidVariant = cva(['font-semibold'], {
474
487
  Validates parenthesized expressions and type assertions
475
488
  Example: `className={(isError ? 'bg-red-500' : 'bg-blue-500')}`, `className={('flex' as string)}`, `className={expr!}`
476
489
 
490
+ - [X] **CSS Variables** → [`css-variables.tsx`](./example/src/css-variables.tsx)
491
+ Validates CSS custom properties (variables) using arbitrary property syntax
492
+ Example: `className="[--card-bg:#1e293b] bg-[var(--card-bg)]"`
493
+
477
494
  - [ ] **Expression Variable**
478
495
  Validates variable references
479
496
  Example: `const dynamicClass = isActive ? 'bg-blue-500' : 'bg-gray-500'; <div className={dynamicClass}>Dynamic</div>`
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=TailwindValidator.css-vars.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TailwindValidator.css-vars.spec.d.ts","sourceRoot":"","sources":["../../src/infrastructure/TailwindValidator.css-vars.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = __importDefault(require("fs"));
7
+ const os_1 = __importDefault(require("os"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const TailwindValidator_1 = require("./TailwindValidator");
10
+ // Mock logger for testing
11
+ class MockLogger {
12
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
13
+ log(_message) {
14
+ // Silent during tests
15
+ }
16
+ }
17
+ describe('TailwindValidator - CSS Variables', () => {
18
+ let validator;
19
+ let tempCssFile;
20
+ beforeAll(async () => {
21
+ // Create a temporary CSS file for testing
22
+ const tempDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'tailwind-test-'));
23
+ tempCssFile = path_1.default.join(tempDir, 'global.css');
24
+ fs_1.default.writeFileSync(tempCssFile, '@import "tailwindcss";');
25
+ validator = new TailwindValidator_1.TailwindValidator(tempCssFile, new MockLogger());
26
+ await validator.initialize();
27
+ });
28
+ describe('CSS variable definitions', () => {
29
+ it('should validate CSS variable definition with color', () => {
30
+ expect(validator.isValidClass('[--card-bg:#1e293b]')).toBe(true);
31
+ });
32
+ it('should validate CSS variable definition with size', () => {
33
+ expect(validator.isValidClass('[--card-radius:16px]')).toBe(true);
34
+ });
35
+ it('should validate CSS variable definition with arbitrary name', () => {
36
+ expect(validator.isValidClass('[--my-custom-var:#ff0000]')).toBe(true);
37
+ });
38
+ it('should validate multiple CSS variable definitions', () => {
39
+ expect(validator.isValidClass('[--color-primary:#3b82f6]')).toBe(true);
40
+ expect(validator.isValidClass('[--color-secondary:#8b5cf6]')).toBe(true);
41
+ expect(validator.isValidClass('[--spacing:1rem]')).toBe(true);
42
+ });
43
+ });
44
+ describe('CSS variable usage', () => {
45
+ it('should validate var() in background color', () => {
46
+ expect(validator.isValidClass('bg-[var(--card-bg)]')).toBe(true);
47
+ });
48
+ it('should validate var() in border radius', () => {
49
+ expect(validator.isValidClass('rounded-[var(--card-radius)]')).toBe(true);
50
+ });
51
+ it('should validate var() in text color', () => {
52
+ expect(validator.isValidClass('text-[var(--my-color)]')).toBe(true);
53
+ });
54
+ it('should validate var() in width', () => {
55
+ expect(validator.isValidClass('w-[var(--my-size)]')).toBe(true);
56
+ });
57
+ it('should validate var() in height', () => {
58
+ expect(validator.isValidClass('h-[var(--my-size)]')).toBe(true);
59
+ });
60
+ });
61
+ describe('combined CSS variables', () => {
62
+ it('should validate all classes from user example', () => {
63
+ const classes = [
64
+ '[--card-bg:#1e293b]',
65
+ '[--card-radius:16px]',
66
+ 'bg-[var(--card-bg)]',
67
+ 'rounded-[var(--card-radius)]',
68
+ 'p-4'
69
+ ];
70
+ classes.forEach(className => {
71
+ expect(validator.isValidClass(className)).toBe(true);
72
+ });
73
+ });
74
+ it('should have no invalid classes in combined example', () => {
75
+ const classes = [
76
+ '[--card-bg:#1e293b]',
77
+ '[--card-radius:16px]',
78
+ 'bg-[var(--card-bg)]',
79
+ 'rounded-[var(--card-radius)]',
80
+ 'p-4'
81
+ ];
82
+ const invalid = validator.getInvalidClasses(classes);
83
+ expect(invalid).toEqual([]);
84
+ });
85
+ });
86
+ });
87
+ //# sourceMappingURL=TailwindValidator.css-vars.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TailwindValidator.css-vars.spec.js","sourceRoot":"","sources":["../../src/infrastructure/TailwindValidator.css-vars.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tailwind-typescript-plugin",
3
- "version": "0.0.2-beta.5",
3
+ "version": "0.0.2-beta.6",
4
4
  "description": "TypeScript Language Service plugin that validates Tailwind CSS class names in JSX/TSX files. Catches typos and invalid classes in real-time with support for tailwind-variants and class-variance-authority.",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",