Skip to content

Commit b09d1a2

Browse files
authored
Merge pull request #2 from morishxt/rename-export-function
Rename export function: `windCtrl` -> `windctrl` (& `wc` as an alias)
2 parents fdb5014 + 2f79624 commit b09d1a2

File tree

4 files changed

+51
-43
lines changed

4 files changed

+51
-43
lines changed

README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ It evolves the concept of Variant APIs (like [cva](https://cva.style/)) by intro
2121

2222
Explore the API interactively. I have prepared a **context-aware ChatGPT session** to act as your coding companion. It understands the full WindCtrl API and can generate production-ready code for your specific use cases.
2323

24-
👉 [**Open Interactive Guide in ChatGPT**](<https://chatgpt.com/?q=Please%20explain%20how%20to%20use%20WindCtrl%20and%20compare%20it%20with%20cva%20and%20Tailwind%20Variants%20based%20on%20the%20source%20code%20in%20the%20README%20below.%0A%0A---%0A%0AREADME%3A%0A%0A%23%20WindCtrl%0A%0A%3E%20Advanced%20variant%20API%20for%20Tailwind%20CSS%20with%20stackable%20traits%20and%20interpolated%20dynamic%20styles.%0A%0A%2A%2AWindCtrl%2A%2A%20is%20a%20next-generation%20styling%20utility%20that%20unifies%20static%20Tailwind%20classes%20and%20dynamic%20inline%20styles%20into%20a%20single%2C%20type-safe%20interface.%0A%0AIt%20evolves%20the%20concept%20of%20Variant%20APIs%20(like%20%5Bcva%5D(https%3A%2F%2Fcva.style%2F))%20by%20introducing%20%2A%2AStackable%20Traits%2A%2A%20to%20solve%20combinatorial%20explosion%20and%20%2A%2AInterpolated%20Variants%2A%2A%20for%20seamless%20dynamic%20value%20handling%E2%80%94all%20while%20maintaining%20a%20minimal%20runtime%20footprint%20optimized%20for%20Tailwind%27s%20JIT%20compiler.%0A%0A%23%23%20Features%0A%0A-%20%F0%9F%8E%A8%20%2A%2AUnified%20API%2A%2A%20-%20Seamlessly%20blends%20static%20Tailwind%20classes%20and%20dynamic%20inline%20styles%20into%20one%20cohesive%20interface.%0A-%20%F0%9F%A7%A9%20%2A%2ATrait%20System%2A%2A%20-%20Solves%20combinatorial%20explosion%20by%20treating%20states%20as%20stackable%2C%20non-exclusive%20layers.%0A-%20%F0%9F%8E%AF%20%2A%2AScoped%20Styling%2A%2A%20-%20Context-aware%20styling%20using%20data%20attributes%20-%20no%20React%20Context%20required%20(RSC%20friendly).%0A-%20%E2%9A%A1%20%2A%2AJIT%20Optimized%2A%2A%20-%20Prevents%20CSS%20bundle%20bloat%20by%20intelligently%20routing%20arbitrary%20values%20to%20inline%20styles.%0A-%20%F0%9F%94%92%20%2A%2AType-Safe%2A%2A%20-%20Best-in-class%20TypeScript%20support%20with%20automatic%20prop%20inference.%0A-%20%F0%9F%93%A6%20%2A%2AMinimal%20Overhead%2A%2A%20-%20Ultra-lightweight%20runtime%20with%20only%20%60clsx%60%20and%20%60tailwind-merge%60%20as%20dependencies.%0A%0A%23%23%20Installation%0A%0A%60%60%60bash%0Anpm%20install%20windctrl%0A%60%60%60%0A%0A%23%23%20Quick%20Start%0A%0A%60%60%60typescript%0Aimport%20%7B%20windCtrl%20%7D%20from%20%22windctrl%22%3B%0A%0Aconst%20button%20%3D%20windCtrl(%7B%0A%20%20base%3A%20%22rounded%20px-4%20py-2%20font-medium%20transition%20duration-200%22%2C%0A%20%20variants%3A%20%7B%0A%20%20%20%20intent%3A%20%7B%0A%20%20%20%20%20%20primary%3A%20%22bg-blue-500%20text-white%20hover%3Abg-blue-600%22%2C%0A%20%20%20%20%20%20secondary%3A%20%22bg-gray-200%20text-gray-900%20hover%3Abg-gray-300%22%2C%0A%20%20%20%20%7D%2C%0A%20%20%20%20size%3A%20%7B%0A%20%20%20%20%20%20sm%3A%20%22text-sm%20h-8%22%2C%0A%20%20%20%20%20%20md%3A%20%22text-base%20h-10%22%2C%0A%20%20%20%20%20%20lg%3A%20%22text-lg%20h-12%22%2C%0A%20%20%20%20%7D%2C%0A%20%20%7D%2C%0A%20%20traits%3A%20%7B%0A%20%20%20%20loading%3A%20%22opacity-70%20cursor-wait%20pointer-events-none%22%2C%0A%20%20%20%20glass%3A%20%22backdrop-blur-md%20bg-white%2F10%20border%20border-white%2F20%20shadow-xl%22%2C%0A%20%20%7D%2C%0A%20%20dynamic%3A%20%7B%0A%20%20%20%20w%3A%20(val)%20%3D%3E%0A%20%20%20%20%20%20typeof%20val%20%3D%3D%3D%20%22number%22%20%3F%20%7B%20style%3A%20%7B%20width%3A%20%60%24%7Bval%7Dpx%60%20%7D%20%7D%20%3A%20val%2C%0A%20%20%7D%2C%0A%20%20defaultVariants%3A%20%7B%0A%20%20%20%20intent%3A%20%22primary%22%2C%0A%20%20%20%20size%3A%20%22md%22%2C%0A%20%20%7D%2C%0A%7D)%3B%0A%0A%2F%2F%20Usage%20Example%0A%0A%2F%2F%201.%20Standard%20usage%0Abutton(%7B%20intent%3A%20%22primary%22%2C%20size%3A%20%22lg%22%20%7D)%3B%0A%0A%2F%2F%202.%20Using%20Traits%20(Stackable%20states)%0Abutton(%7B%20traits%3A%20%5B%22glass%22%2C%20%22loading%22%5D%20%7D)%3B%0A%0A%2F%2F%203.%20Unified%20API%20for%20dynamic%20values%0A%2F%2F%20Pass%20a%20number%20for%20arbitrary%20px%20value%20(Inline%20Style)%0Abutton(%7B%20w%3A%20350%20%7D)%3B%0A%2F%2F%20Pass%20a%20string%20for%20Tailwind%20utility%20(Static%20Class)%0Abutton(%7B%20w%3A%20%22w-full%22%20%7D)%3B%0A%60%>)
24+
👉 [**Open Interactive Guide in ChatGPT**](<https://chatgpt.com/?q=Please%20explain%20how%20to%20use%20WindCtrl%20and%20compare%20it%20with%20cva%20and%20Tailwind%20Variants%20based%20on%20the%20source%20code%20in%20the%20README%20below.%0A%0A---%0A%0AREADME%3A%0A%0A%23%20WindCtrl%0A%0A%3E%20Advanced%20variant%20API%20for%20Tailwind%20CSS%20with%20stackable%20traits%20and%20interpolated%20dynamic%20styles.%0A%0A%2A%2AWindCtrl%2A%2A%20is%20a%20next-generation%20styling%20utility%20that%20unifies%20static%20Tailwind%20classes%20and%20dynamic%20inline%20styles%20into%20a%20single%2C%20type-safe%20interface.%0A%0AIt%20evolves%20the%20concept%20of%20Variant%20APIs%20(like%20%5Bcva%5D(https%3A%2F%2Fcva.style%2F))%20by%20introducing%20%2A%2AStackable%20Traits%2A%2A%20to%20solve%20combinatorial%20explosion%20and%20%2A%2AInterpolated%20Variants%2A%2A%20for%20seamless%20dynamic%20value%20handling%E2%80%94all%20while%20maintaining%20a%20minimal%20runtime%20footprint%20optimized%20for%20Tailwind%27s%20JIT%20compiler.%0A%0A%23%23%20Features%0A%0A-%20%F0%9F%8E%A8%20%2A%2AUnified%20API%2A%2A%20-%20Seamlessly%20blends%20static%20Tailwind%20classes%20and%20dynamic%20inline%20styles%20into%20one%20cohesive%20interface.%0A-%20%F0%9F%A7%A9%20%2A%2ATrait%20System%2A%2A%20-%20Solves%20combinatorial%20explosion%20by%20treating%20states%20as%20stackable%2C%20non-exclusive%20layers.%0A-%20%F0%9F%8E%AF%20%2A%2AScoped%20Styling%2A%2A%20-%20Context-aware%20styling%20using%20data%20attributes%20-%20no%20React%20Context%20required%20(RSC%20friendly).%0A-%20%E2%9A%A1%20%2A%2AJIT%20Optimized%2A%2A%20-%20Prevents%20CSS%20bundle%20bloat%20by%20intelligently%20routing%20arbitrary%20values%20to%20inline%20styles.%0A-%20%F0%9F%94%92%20%2A%2AType-Safe%2A%2A%20-%20Best-in-class%20TypeScript%20support%20with%20automatic%20prop%20inference.%0A-%20%F0%9F%93%A6%20%2A%2AMinimal%20Overhead%2A%2A%20-%20Ultra-lightweight%20runtime%20with%20only%20%60clsx%60%20and%20%60tailwind-merge%60%20as%20dependencies.%0A%0A%23%23%20Installation%0A%0A%60%60%60bash%0Anpm%20install%20windctrl%0A%60%60%60%0A%0A%23%23%20Quick%20Start%0A%0A%60%60%60typescript%0Aimport%20%7B%20windctrl%20%7D%20from%20%22windctrl%22%3B%0A%0Aconst%20button%20%3D%20windctrl(%7B%0A%20%20base%3A%20%22rounded%20px-4%20py-2%20font-medium%20transition%20duration-200%22%2C%0A%20%20variants%3A%20%7B%0A%20%20%20%20intent%3A%20%7B%0A%20%20%20%20%20%20primary%3A%20%22bg-blue-500%20text-white%20hover%3Abg-blue-600%22%2C%0A%20%20%20%20%20%20secondary%3A%20%22bg-gray-200%20text-gray-900%20hover%3Abg-gray-300%22%2C%0A%20%20%20%20%7D%2C%0A%20%20%20%20size%3A%20%7B%0A%20%20%20%20%20%20sm%3A%20%22text-sm%20h-8%22%2C%0A%20%20%20%20%20%20md%3A%20%22text-base%20h-10%22%2C%0A%20%20%20%20%20%20lg%3A%20%22text-lg%20h-12%22%2C%0A%20%20%20%20%7D%2C%0A%20%20%7D%2C%0A%20%20traits%3A%20%7B%0A%20%20%20%20loading%3A%20%22opacity-70%20cursor-wait%20pointer-events-none%22%2C%0A%20%20%20%20glass%3A%20%22backdrop-blur-md%20bg-white%2F10%20border%20border-white%2F20%20shadow-xl%22%2C%0A%20%20%7D%2C%0A%20%20dynamic%3A%20%7B%0A%20%20%20%20w%3A%20(val)%20%3D%3E%0A%20%20%20%20%20%20typeof%20val%20%3D%3D%3D%20%22number%22%20%3F%20%7B%20style%3A%20%7B%20width%3A%20%60%24%7Bval%7Dpx%60%20%7D%20%7D%20%3A%20val%2C%0A%20%20%7D%2C%0A%20%20defaultVariants%3A%20%7B%0A%20%20%20%20intent%3A%20%22primary%22%2C%0A%20%20%20%20size%3A%20%22md%22%2C%0A%20%20%7D%2C%0A%7D)%3B%0A%0A%2F%2F%20Usage%20Example%0A%0A%2F%2F%201.%20Standard%20usage%0Abutton(%7B%20intent%3A%20%22primary%22%2C%20size%3A%20%22lg%22%20%7D)%3B%0A%0A%2F%2F%202.%20Using%20Traits%20(Stackable%20states)%0Abutton(%7B%20traits%3A%20%5B%22glass%22%2C%20%22loading%22%5D%20%7D)%3B%0A%0A%2F%2F%203.%20Unified%20API%20for%20dynamic%20values%0A%2F%2F%20Pass%20a%20number%20for%20arbitrary%20px%20value%20(Inline%20Style)%0Abutton(%7B%20w%3A%20350%20%7D)%3B%0A%2F%2F%20Pass%20a%20string%20for%20Tailwind%20utility%20(Static%20Class)%0Abutton(%7B%20w%3A%20%22w-full%22%20%7D)%3B%0A%60%>)
2525

2626
> **Note:** The entire source code is just ~200 lines - small enough to fit entirely in your AI's context window for perfect understanding! :D
2727
@@ -34,9 +34,9 @@ npm install windctrl
3434
## Quick Start
3535

3636
```typescript
37-
import { windCtrl } from "windctrl";
37+
import { windctrl } from "windctrl";
3838

39-
const button = windCtrl({
39+
const button = windctrl({
4040
base: "rounded px-4 py-2 font-medium transition duration-200",
4141
variants: {
4242
intent: {
@@ -91,7 +91,7 @@ This is **JIT-friendly by design**, as long as the class strings you return are
9191
For truly unbounded values (e.g. pixel sizes), prefer returning style to avoid relying on arbitrary-value class generation.
9292

9393
```typescript
94-
const button = windCtrl({
94+
const button = windctrl({
9595
dynamic: {
9696
// Recommended pattern:
9797
// - Numbers -> inline styles (unbounded values)
@@ -118,7 +118,7 @@ When multiple traits generate conflicting utilities, Tailwind’s “last one wi
118118
If ordering matters, prefer the **array form** to make precedence explicit.
119119

120120
```typescript
121-
const button = windCtrl({
121+
const button = windctrl({
122122
traits: {
123123
loading: "opacity-50 cursor-wait",
124124
glass: "backdrop-blur-md bg-white/10 border border-white/20",
@@ -138,7 +138,7 @@ button({ traits: { loading: isLoading, glass: true } });
138138
Scopes enable **context-aware styling** without relying on React Context or client-side JavaScript. This makes them fully compatible with React Server Components (RSC). They utilize Tailwind's group modifier logic under the hood.
139139

140140
```typescript
141-
const button = windCtrl({
141+
const button = windctrl({
142142
scopes: {
143143
header: "text-sm py-1",
144144
footer: "text-xs text-gray-500",
@@ -160,7 +160,7 @@ The scope classes are automatically prefixed with `group-data-[scope=...]/wind-s
160160
Variants represent mutually exclusive design choices (e.g., `primary` vs `secondary`). They serve as the foundation of your component's design system.
161161

162162
```typescript
163-
const button = windCtrl({
163+
const button = windctrl({
164164
variants: {
165165
intent: {
166166
primary: "bg-blue-500 text-white hover:bg-blue-600",
@@ -187,7 +187,7 @@ button({ intent: "primary", size: "lg" });
187187
- **Tailwind JIT:** Tailwind only generates CSS for class names it can statically detect. Avoid constructing class strings dynamically unless you safelist them.
188188
- **Traits precedence:** If trait order matters, use the array form (`traits: ["a", "b"]`) to make precedence explicit.
189189
- **SSR/RSC:** Keep dynamic resolvers pure (same input → same output) to avoid hydration mismatches.
190-
- **Static config:** `windCtrl` configuration is treated as static/immutable. Mutating the config object after creation is not supported.
190+
- **Static config:** `windctrl` configuration is treated as static/immutable. Mutating the config object after creation is not supported.
191191

192192
## License
193193

examples/Button.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import React from "react";
2-
import { windCtrl } from "../src/index";
2+
import { windctrl } from "../src/index";
33
import type { ComponentPropsWithoutRef, ElementType } from "react";
44

5-
const button = windCtrl({
5+
const button = windctrl({
66
base: "inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
77
variants: {
88
intent: {

src/index.test.ts

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
import { describe, it, expect } from "vitest";
2-
import { windCtrl } from "./";
2+
import { windctrl, wc } from "./";
33

4-
describe("windCtrl", () => {
4+
describe("wc", () => {
5+
it("should be the same as windctrl", () => {
6+
expect(wc).toBe(windctrl);
7+
});
8+
});
9+
10+
describe("windctrl", () => {
511
describe("Base classes", () => {
612
it("should apply base classes when provided", () => {
7-
const button = windCtrl({
13+
const button = windctrl({
814
base: "rounded px-4 py-2",
915
});
1016

@@ -16,7 +22,7 @@ describe("windCtrl", () => {
1622
});
1723

1824
it("should work without base classes", () => {
19-
const button = windCtrl({});
25+
const button = windctrl({});
2026

2127
const result = button({});
2228
expect(result.className).toBe("");
@@ -26,7 +32,7 @@ describe("windCtrl", () => {
2632

2733
describe("Variants", () => {
2834
it("should apply variant classes based on prop value", () => {
29-
const button = windCtrl({
35+
const button = windctrl({
3036
base: "rounded",
3137
variants: {
3238
intent: {
@@ -48,7 +54,7 @@ describe("windCtrl", () => {
4854
});
4955

5056
it("should handle multiple variant dimensions", () => {
51-
const button = windCtrl({
57+
const button = windctrl({
5258
variants: {
5359
size: {
5460
sm: "text-sm",
@@ -68,7 +74,7 @@ describe("windCtrl", () => {
6874
});
6975

7076
it("should not apply variant classes when prop is not provided", () => {
71-
const button = windCtrl({
77+
const button = windctrl({
7278
variants: {
7379
intent: {
7480
primary: "bg-blue-500",
@@ -85,7 +91,7 @@ describe("windCtrl", () => {
8591

8692
describe("Default variants", () => {
8793
it("should apply default variant values when prop is not provided", () => {
88-
const button = windCtrl({
94+
const button = windctrl({
8995
variants: {
9096
intent: {
9197
primary: "bg-blue-500",
@@ -102,7 +108,7 @@ describe("windCtrl", () => {
102108
});
103109

104110
it("should allow overriding default variants", () => {
105-
const button = windCtrl({
111+
const button = windctrl({
106112
variants: {
107113
intent: {
108114
primary: "bg-blue-500",
@@ -120,7 +126,7 @@ describe("windCtrl", () => {
120126
});
121127

122128
it("should handle multiple default variants", () => {
123-
const button = windCtrl({
129+
const button = windctrl({
124130
variants: {
125131
size: {
126132
sm: "text-sm",
@@ -145,7 +151,7 @@ describe("windCtrl", () => {
145151

146152
describe("Traits", () => {
147153
it("should apply trait classes when provided as array", () => {
148-
const button = windCtrl({
154+
const button = windctrl({
149155
base: "rounded",
150156
traits: {
151157
loading: "opacity-50 cursor-wait",
@@ -162,7 +168,7 @@ describe("windCtrl", () => {
162168
});
163169

164170
it("should apply trait classes when provided as object", () => {
165-
const button = windCtrl({
171+
const button = windctrl({
166172
traits: {
167173
loading: "opacity-50",
168174
glass: "backdrop-blur",
@@ -179,7 +185,7 @@ describe("windCtrl", () => {
179185
});
180186

181187
it("should handle empty traits array", () => {
182-
const button = windCtrl({
188+
const button = windctrl({
183189
base: "rounded",
184190
traits: {
185191
loading: "opacity-50",
@@ -192,7 +198,7 @@ describe("windCtrl", () => {
192198
});
193199

194200
it("should handle empty traits object", () => {
195-
const button = windCtrl({
201+
const button = windctrl({
196202
base: "rounded",
197203
traits: {
198204
loading: "opacity-50",
@@ -205,7 +211,7 @@ describe("windCtrl", () => {
205211
});
206212

207213
it("should apply multiple traits orthogonally", () => {
208-
const button = windCtrl({
214+
const button = windctrl({
209215
traits: {
210216
loading: "opacity-50",
211217
glass: "backdrop-blur",
@@ -224,7 +230,7 @@ describe("windCtrl", () => {
224230

225231
describe("Dynamic (Interpolated Variants)", () => {
226232
it("should apply className when dynamic resolver returns string", () => {
227-
const button = windCtrl({
233+
const button = windctrl({
228234
dynamic: {
229235
w: (val) => (typeof val === "number" ? `w-[${val}px]` : `w-${val}`),
230236
},
@@ -236,7 +242,7 @@ describe("windCtrl", () => {
236242
});
237243

238244
it("should apply style when dynamic resolver returns object with style", () => {
239-
const button = windCtrl({
245+
const button = windctrl({
240246
dynamic: {
241247
w: (val) =>
242248
typeof val === "number"
@@ -250,7 +256,7 @@ describe("windCtrl", () => {
250256
});
251257

252258
it("should merge className and style when dynamic resolver returns both", () => {
253-
const button = windCtrl({
259+
const button = windctrl({
254260
base: "rounded",
255261
dynamic: {
256262
color: (val) => ({
@@ -266,7 +272,7 @@ describe("windCtrl", () => {
266272
});
267273

268274
it("should handle multiple dynamic props", () => {
269-
const button = windCtrl({
275+
const button = windctrl({
270276
dynamic: {
271277
w: (val) =>
272278
typeof val === "number"
@@ -284,7 +290,7 @@ describe("windCtrl", () => {
284290
});
285291

286292
it("should handle mixed dynamic props (string and number)", () => {
287-
const button = windCtrl({
293+
const button = windctrl({
288294
dynamic: {
289295
w: (val) =>
290296
typeof val === "number"
@@ -304,7 +310,7 @@ describe("windCtrl", () => {
304310

305311
describe("Scopes", () => {
306312
it("should apply scope classes with group-data selector", () => {
307-
const button = windCtrl({
313+
const button = windctrl({
308314
base: "rounded",
309315
scopes: {
310316
header: "text-sm",
@@ -322,7 +328,7 @@ describe("windCtrl", () => {
322328
});
323329

324330
it("should combine scopes with base classes", () => {
325-
const button = windCtrl({
331+
const button = windctrl({
326332
base: "px-4 py-2",
327333
scopes: {
328334
header: "text-sm",
@@ -340,7 +346,7 @@ describe("windCtrl", () => {
340346

341347
describe("Priority and Integration", () => {
342348
it("should apply classes in correct priority: Dynamic > Traits > Variants > Base", () => {
343-
const button = windCtrl({
349+
const button = windctrl({
344350
base: "base-class",
345351
variants: {
346352
intent: {
@@ -368,7 +374,7 @@ describe("windCtrl", () => {
368374
});
369375

370376
it("should handle complex real-world scenario", () => {
371-
const button = windCtrl({
377+
const button = windctrl({
372378
base: "rounded px-4 py-2 font-medium transition",
373379
variants: {
374380
intent: {
@@ -427,7 +433,7 @@ describe("windCtrl", () => {
427433
});
428434

429435
it("should merge conflicting Tailwind classes (last one wins)", () => {
430-
const button = windCtrl({
436+
const button = windctrl({
431437
base: "text-red-500",
432438
variants: {
433439
intent: {
@@ -444,14 +450,14 @@ describe("windCtrl", () => {
444450

445451
describe("Edge cases", () => {
446452
it("should handle empty configuration", () => {
447-
const button = windCtrl({});
453+
const button = windctrl({});
448454
const result = button({});
449455
expect(result.className).toBe("");
450456
expect(result.style).toEqual(undefined);
451457
});
452458

453459
it("should handle undefined props gracefully", () => {
454-
const button = windCtrl({
460+
const button = windctrl({
455461
variants: {
456462
intent: {
457463
primary: "bg-blue-500",
@@ -464,7 +470,7 @@ describe("windCtrl", () => {
464470
});
465471

466472
it("should handle null props gracefully", () => {
467-
const button = windCtrl({
473+
const button = windctrl({
468474
variants: {
469475
intent: {
470476
primary: "bg-blue-500",
@@ -477,7 +483,7 @@ describe("windCtrl", () => {
477483
});
478484

479485
it("should handle traits with invalid keys gracefully", () => {
480-
const button = windCtrl({
486+
const button = windctrl({
481487
traits: {
482488
loading: "opacity-50",
483489
},
@@ -490,7 +496,7 @@ describe("windCtrl", () => {
490496

491497
describe("Type safety", () => {
492498
it("should infer variant prop types correctly", () => {
493-
const button = windCtrl({
499+
const button = windctrl({
494500
variants: {
495501
intent: {
496502
primary: "bg-blue-500",
@@ -507,7 +513,7 @@ describe("windCtrl", () => {
507513
});
508514

509515
it("should infer trait keys correctly", () => {
510-
const button = windCtrl({
516+
const button = windctrl({
511517
traits: {
512518
loading: "opacity-50",
513519
glass: "backdrop-blur",
@@ -526,7 +532,7 @@ describe("windCtrl", () => {
526532
});
527533

528534
it("should infer dynamic prop types correctly", () => {
529-
const button = windCtrl({
535+
const button = windctrl({
530536
dynamic: {
531537
w: (val) =>
532538
typeof val === "number"

0 commit comments

Comments
 (0)