tailwind-styled-v4 5.0.8 → 5.0.10

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.
Files changed (140) hide show
  1. package/CHANGELOG.md +204 -416
  2. package/README.md +45 -15
  3. package/dist/{analyzeWorkspace-DuJKh7Ty.d.mts → analyzeWorkspace-BS5O4rhC.d.mts} +47 -2
  4. package/dist/{analyzeWorkspace-Ct_NTAWt.d.ts → analyzeWorkspace-DDOQdzzI.d.ts} +47 -2
  5. package/dist/analyzer.d.mts +5 -3
  6. package/dist/analyzer.d.ts +5 -3
  7. package/dist/analyzer.js +563 -468
  8. package/dist/analyzer.js.map +1 -1
  9. package/dist/analyzer.mjs +562 -467
  10. package/dist/analyzer.mjs.map +1 -1
  11. package/dist/animate.d.mts +4 -7
  12. package/dist/animate.d.ts +4 -7
  13. package/dist/animate.js +171 -265
  14. package/dist/animate.js.map +1 -1
  15. package/dist/animate.mjs +165 -264
  16. package/dist/animate.mjs.map +1 -1
  17. package/dist/atomic.d.mts +22 -1
  18. package/dist/atomic.d.ts +22 -1
  19. package/dist/atomic.js +221 -165
  20. package/dist/atomic.js.map +1 -1
  21. package/dist/atomic.mjs +200 -165
  22. package/dist/atomic.mjs.map +1 -1
  23. package/dist/cli.d.mts +60 -1
  24. package/dist/cli.d.ts +60 -1
  25. package/dist/cli.js +1261 -1517
  26. package/dist/cli.js.map +1 -1
  27. package/dist/cli.mjs +1238 -1513
  28. package/dist/cli.mjs.map +1 -1
  29. package/dist/compiler.d.mts +38 -7
  30. package/dist/compiler.d.ts +38 -7
  31. package/dist/compiler.js +174 -197
  32. package/dist/compiler.js.map +1 -1
  33. package/dist/compiler.mjs +151 -194
  34. package/dist/compiler.mjs.map +1 -1
  35. package/dist/devtools.js +7 -31
  36. package/dist/devtools.js.map +1 -1
  37. package/dist/devtools.mjs +7 -31
  38. package/dist/devtools.mjs.map +1 -1
  39. package/dist/engine.d.mts +134 -63
  40. package/dist/engine.d.ts +134 -63
  41. package/dist/engine.js +2863 -2482
  42. package/dist/engine.js.map +1 -1
  43. package/dist/engine.mjs +2852 -2485
  44. package/dist/engine.mjs.map +1 -1
  45. package/dist/{index-eWAocnD2.d.mts → index-NDINUhLN.d.mts} +3 -1
  46. package/dist/{index-eWAocnD2.d.ts → index-NDINUhLN.d.ts} +3 -1
  47. package/dist/index.d.mts +63 -32
  48. package/dist/index.d.ts +63 -32
  49. package/dist/index.js +335 -169
  50. package/dist/index.js.map +1 -1
  51. package/dist/index.mjs +315 -169
  52. package/dist/index.mjs.map +1 -1
  53. package/dist/{liveTokenEngine-DSUk88P6.d.ts → liveTokenEngine-CN9ian1R.d.ts} +1 -1
  54. package/dist/{liveTokenEngine-CX5_0c4q.d.mts → liveTokenEngine-DKoWRtqH.d.mts} +1 -1
  55. package/dist/next.d.mts +10 -4
  56. package/dist/next.d.ts +10 -4
  57. package/dist/next.js +32 -45
  58. package/dist/next.js.map +1 -1
  59. package/dist/next.mjs +30 -43
  60. package/dist/next.mjs.map +1 -1
  61. package/dist/plugin-api.d.mts +8 -2
  62. package/dist/plugin-api.d.ts +8 -2
  63. package/dist/plugin-api.js +14 -2
  64. package/dist/plugin-api.js.map +1 -1
  65. package/dist/plugin-api.mjs +14 -3
  66. package/dist/plugin-api.mjs.map +1 -1
  67. package/dist/plugin-registry.js +51 -11
  68. package/dist/plugin-registry.js.map +1 -1
  69. package/dist/plugin-registry.mjs +51 -11
  70. package/dist/plugin-registry.mjs.map +1 -1
  71. package/dist/plugin.d.mts +5 -7
  72. package/dist/plugin.d.ts +5 -7
  73. package/dist/plugin.js +16 -15
  74. package/dist/plugin.js.map +1 -1
  75. package/dist/plugin.mjs +16 -16
  76. package/dist/plugin.mjs.map +1 -1
  77. package/dist/rspack.js +17 -38
  78. package/dist/rspack.js.map +1 -1
  79. package/dist/rspack.mjs +15 -36
  80. package/dist/rspack.mjs.map +1 -1
  81. package/dist/runtime.d.mts +2 -2
  82. package/dist/runtime.d.ts +2 -2
  83. package/dist/scanner.d.mts +10 -1
  84. package/dist/scanner.d.ts +10 -1
  85. package/dist/scanner.js +298 -124
  86. package/dist/scanner.js.map +1 -1
  87. package/dist/scanner.mjs +296 -124
  88. package/dist/scanner.mjs.map +1 -1
  89. package/dist/shared.d.mts +1 -1
  90. package/dist/shared.d.ts +1 -1
  91. package/dist/shared.js +104 -176
  92. package/dist/shared.js.map +1 -1
  93. package/dist/shared.mjs +85 -176
  94. package/dist/shared.mjs.map +1 -1
  95. package/dist/storybook-addon.d.mts +1 -1
  96. package/dist/storybook-addon.d.ts +1 -1
  97. package/dist/svelte.d.mts +1 -1
  98. package/dist/svelte.d.ts +1 -1
  99. package/dist/svelte.js +166 -3
  100. package/dist/svelte.js.map +1 -1
  101. package/dist/svelte.mjs +143 -1
  102. package/dist/svelte.mjs.map +1 -1
  103. package/dist/syntax.js +21 -21
  104. package/dist/syntax.js.map +1 -1
  105. package/dist/syntax.mjs +21 -21
  106. package/dist/syntax.mjs.map +1 -1
  107. package/dist/testing.js +9 -1
  108. package/dist/testing.js.map +1 -1
  109. package/dist/testing.mjs +9 -1
  110. package/dist/testing.mjs.map +1 -1
  111. package/dist/theme.d.mts +2 -2
  112. package/dist/theme.d.ts +2 -2
  113. package/dist/theme.js +40 -112
  114. package/dist/theme.js.map +1 -1
  115. package/dist/theme.mjs +37 -110
  116. package/dist/theme.mjs.map +1 -1
  117. package/dist/turbopackLoader.js +84 -126
  118. package/dist/turbopackLoader.js.map +1 -1
  119. package/dist/turbopackLoader.mjs +68 -124
  120. package/dist/turbopackLoader.mjs.map +1 -1
  121. package/dist/tw.js +1256 -1517
  122. package/dist/tw.js.map +1 -1
  123. package/dist/tw.mjs +1236 -1513
  124. package/dist/tw.mjs.map +1 -1
  125. package/dist/vite.js +1783 -823
  126. package/dist/vite.js.map +1 -1
  127. package/dist/vite.mjs +1767 -821
  128. package/dist/vite.mjs.map +1 -1
  129. package/dist/vue.d.mts +1 -1
  130. package/dist/vue.d.ts +1 -1
  131. package/dist/vue.js +165 -4
  132. package/dist/vue.js.map +1 -1
  133. package/dist/vue.mjs +141 -1
  134. package/dist/vue.mjs.map +1 -1
  135. package/dist/webpackLoader.js +69 -108
  136. package/dist/webpackLoader.js.map +1 -1
  137. package/dist/webpackLoader.mjs +49 -104
  138. package/dist/webpackLoader.mjs.map +1 -1
  139. package/native/tailwind-styled-native.node +0 -0
  140. package/package.json +22 -24
package/README.md CHANGED
@@ -142,9 +142,32 @@ function Alert({ type, children }) {
142
142
  }
143
143
  ```
144
144
 
145
- ### 6. Sub-components (Inline)
145
+ ### 6. Sub-components
146
146
 
147
- Definisikan sub-components langsung di template literal dengan syntax `[name] { classes }` — **TypeScript otomatis infer nama tanpa perlu `.withSub<>()`**.
147
+ Ada **dua cara** mendefinisikan sub-components:
148
+
149
+ #### A. Config Object — Direkomendasikan (Autocomplete + Type Safe)
150
+
151
+ ```tsx
152
+ const Card = tw.div({
153
+ base: "flex flex-col p-4 rounded-xl bg-white shadow",
154
+ sub: {
155
+ header: "font-bold text-lg border-b pb-2",
156
+ body: "text-gray-600 py-2",
157
+ footer: "border-t pt-2 text-sm text-gray-400",
158
+ },
159
+ })
160
+
161
+ // TypeScript infer keys dari object literal → autocomplete penuh
162
+ <Card>
163
+ <Card.header>Judul</Card.header> // ✅ autocomplete
164
+ <Card.body>Konten</Card.body> // ✅ autocomplete
165
+ <Card.footer>Footer</Card.footer> // ✅ autocomplete
166
+ <Card.xyz>?</Card.xyz> // ❌ TypeScript error
167
+ </Card>
168
+ ```
169
+
170
+ #### B. Template Literal Inline — Ringkas (tanpa autocomplete)
148
171
 
149
172
  ```tsx
150
173
  const Card = tw.div`
@@ -154,24 +177,18 @@ const Card = tw.div`
154
177
  [footer] { border-t pt-2 text-sm text-gray-400 }
155
178
  `
156
179
 
157
- // TypeScript otomatis tahu: Card.header, Card.body, Card.footer
180
+ // Runtime benar, tapi TypeScript tidak bisa infer nama dari multiline template —
181
+ // ini limitasi TypeScript, bukan bug library. Gunakan config object untuk type safety.
158
182
  <Card>
159
183
  <Card.header>Judul</Card.header>
160
184
  <Card.body>Konten</Card.body>
161
185
  <Card.footer>Footer</Card.footer>
162
186
  </Card>
163
-
164
- // Autocomplete ✓ — Card.nonexistent akan error TypeScript
165
187
  ```
166
188
 
167
- > **Catatan:** Sub-components **tidak mewarisi** style base `Card`. Mereka adalah komponen terpisah dengan classes dari block `[name] { ... }`. Untuk mewarisi, gunakan `.extend()` (Pattern B di bawah).
189
+ > Sub-components **tidak mewarisi** style base. Untuk mewarisi, pakai `.extend()` (lihat Pattern B di bawah).
168
190
 
169
- **`.withSub<>()`** hanya diperlukan jika nama sub-component tidak muncul di template literal (misalnya di-register secara dinamis):
170
-
171
- ```tsx
172
- // Kasus khusus — nama tidak ada di template
173
- const Modal = tw.div`fixed inset-0`.withSub<"overlay" | "content">()
174
- ```
191
+ > **Sub-component tidak terdefinisi** tidak akan crash library otomatis fallback ke `<span>` passthrough. Tapi tetap gunakan config object untuk catch typo di TypeScript.
175
192
 
176
193
  ### 7. State Engine — Zero-JS State Management
177
194
 
@@ -248,9 +265,22 @@ const IconButton = Button.extend`p-2 rounded-full`
248
265
 
249
266
  ### Pattern Sub-components
250
267
 
251
- **Pattern A: Inline `[name] { }` Direkomendasikan**
268
+ **Pattern A: Config Object Direkomendasikan (autocomplete + type safe)**
269
+
270
+ ```tsx
271
+ const Card = tw.div({
272
+ base: "flex flex-col p-4 rounded-xl bg-white shadow",
273
+ sub: {
274
+ header: "font-bold text-lg border-b pb-2",
275
+ body: "text-gray-600 py-2",
276
+ footer: "border-t pt-2 text-sm",
277
+ },
278
+ })
279
+ // TypeScript infer: Card.header, Card.body, Card.footer ✅ autocomplete
280
+ // Card.xyz → TypeScript error ✅
281
+ ```
252
282
 
253
- Cocok kalau sub-components punya style sendiri yang *tidak perlu* mewarisi base:
283
+ **Pattern A2: Inline Template `[name] { }` Ringkas (tanpa autocomplete)**
254
284
 
255
285
  ```tsx
256
286
  const Card = tw.div`
@@ -259,7 +289,7 @@ const Card = tw.div`
259
289
  [body] { text-gray-600 py-2 }
260
290
  [footer] { border-t pt-2 text-sm }
261
291
  `
262
- // TypeScript otomatis: Card.header, Card.body, Card.footer
292
+ // Runtime benar — TypeScript tidak bisa infer nama dari multiline template literal
263
293
  ```
264
294
 
265
295
  **Pattern B: `.extend()` — Sub-components Mewarisi Style Base**
@@ -43,6 +43,8 @@ interface AnalyzerReport {
43
43
  readonly uniqueClassCount: number;
44
44
  readonly totalClassOccurrences: number;
45
45
  readonly classStats: AnalyzerClassStats;
46
+ /** Alias for classStats.top — backward compat & test contract */
47
+ readonly topClasses: readonly ClassUsage[];
46
48
  readonly safelist: readonly string[];
47
49
  readonly semantic?: AnalyzerSemanticReport;
48
50
  }
@@ -69,9 +71,52 @@ interface ClassToCssResult {
69
71
  readonly unknownClasses: readonly string[];
70
72
  readonly sizeBytes: number;
71
73
  }
74
+ interface NativeAnalyzerBinding {
75
+ analyzeClasses(filesJson: string, cwd: string, flags: number): unknown;
76
+ compileCss?: (classes: string[], prefix: string | null) => unknown;
77
+ /** Detect conflicting Tailwind utilities in a usage list. */
78
+ detectClassConflicts?(usagesJson: string): {
79
+ conflicts: Array<{
80
+ group: string;
81
+ variantKey: string;
82
+ classes: string[];
83
+ message: string;
84
+ }>;
85
+ conflictedClassNames: string[];
86
+ };
87
+ /** Classify classes as known/unknown Tailwind utilities. */
88
+ classifyKnownClasses?(classes: string[], safelist: string[], customUtilities: string[]): Array<{
89
+ className: string;
90
+ isKnown: boolean;
91
+ variantKey: string;
92
+ baseClass: string;
93
+ utilityPrefix: string;
94
+ isArbitrary: boolean;
95
+ }>;
96
+ /** Aggregate class counts from scan files JSON. */
97
+ collectClassCounts?(filesJson: string): Array<{
98
+ name: string;
99
+ count: number;
100
+ }>;
101
+ /** Compute frequency distribution buckets for class usages. */
102
+ computeClassStats?(usagesJson: string, topLimit: number, frequentThreshold: number): {
103
+ totalClassOccurrences: number;
104
+ topJson: string;
105
+ frequentJson: string;
106
+ uniqueJson: string;
107
+ };
108
+ buildDistribution?(usagesJson: string): {
109
+ once: number;
110
+ few: number;
111
+ moderate: number;
112
+ frequent: number;
113
+ };
114
+ }
115
+
116
+ declare function requireNativeBinding(): Promise<NativeAnalyzerBinding>;
72
117
 
73
- declare function collectClassCounts(scan: ScanWorkspaceResult): Map<string, number>;
74
- declare function buildDistribution(usages: ClassUsage[]): Record<string, number>;
118
+ declare function collectClassCounts(scan: ScanWorkspaceResult): Promise<Map<string, number>>;
119
+ declare function buildDistribution(usages: ClassUsage[], native?: Awaited<ReturnType<typeof requireNativeBinding>>): Promise<Record<string, number>>;
75
120
  /**
76
121
  * Analyze Tailwind class usage in a workspace and return usage statistics.
77
122
  * Set `semantic.tailwindConfigPath` to override Tailwind config lookup.
@@ -43,6 +43,8 @@ interface AnalyzerReport {
43
43
  readonly uniqueClassCount: number;
44
44
  readonly totalClassOccurrences: number;
45
45
  readonly classStats: AnalyzerClassStats;
46
+ /** Alias for classStats.top — backward compat & test contract */
47
+ readonly topClasses: readonly ClassUsage[];
46
48
  readonly safelist: readonly string[];
47
49
  readonly semantic?: AnalyzerSemanticReport;
48
50
  }
@@ -69,9 +71,52 @@ interface ClassToCssResult {
69
71
  readonly unknownClasses: readonly string[];
70
72
  readonly sizeBytes: number;
71
73
  }
74
+ interface NativeAnalyzerBinding {
75
+ analyzeClasses(filesJson: string, cwd: string, flags: number): unknown;
76
+ compileCss?: (classes: string[], prefix: string | null) => unknown;
77
+ /** Detect conflicting Tailwind utilities in a usage list. */
78
+ detectClassConflicts?(usagesJson: string): {
79
+ conflicts: Array<{
80
+ group: string;
81
+ variantKey: string;
82
+ classes: string[];
83
+ message: string;
84
+ }>;
85
+ conflictedClassNames: string[];
86
+ };
87
+ /** Classify classes as known/unknown Tailwind utilities. */
88
+ classifyKnownClasses?(classes: string[], safelist: string[], customUtilities: string[]): Array<{
89
+ className: string;
90
+ isKnown: boolean;
91
+ variantKey: string;
92
+ baseClass: string;
93
+ utilityPrefix: string;
94
+ isArbitrary: boolean;
95
+ }>;
96
+ /** Aggregate class counts from scan files JSON. */
97
+ collectClassCounts?(filesJson: string): Array<{
98
+ name: string;
99
+ count: number;
100
+ }>;
101
+ /** Compute frequency distribution buckets for class usages. */
102
+ computeClassStats?(usagesJson: string, topLimit: number, frequentThreshold: number): {
103
+ totalClassOccurrences: number;
104
+ topJson: string;
105
+ frequentJson: string;
106
+ uniqueJson: string;
107
+ };
108
+ buildDistribution?(usagesJson: string): {
109
+ once: number;
110
+ few: number;
111
+ moderate: number;
112
+ frequent: number;
113
+ };
114
+ }
115
+
116
+ declare function requireNativeBinding(): Promise<NativeAnalyzerBinding>;
72
117
 
73
- declare function collectClassCounts(scan: ScanWorkspaceResult): Map<string, number>;
74
- declare function buildDistribution(usages: ClassUsage[]): Record<string, number>;
118
+ declare function collectClassCounts(scan: ScanWorkspaceResult): Promise<Map<string, number>>;
119
+ declare function buildDistribution(usages: ClassUsage[], native?: Awaited<ReturnType<typeof requireNativeBinding>>): Promise<Record<string, number>>;
75
120
  /**
76
121
  * Analyze Tailwind class usage in a workspace and return usage statistics.
77
122
  * Set `semantic.tailwindConfigPath` to override Tailwind config lookup.
@@ -1,5 +1,5 @@
1
- import { C as ClassToCssOptions, a as ClassToCssResult, c as collectClassCounts, b as buildDistribution } from './analyzeWorkspace-DuJKh7Ty.mjs';
2
- export { A as AnalyzerOptions, d as AnalyzerReport, e as AnalyzerSemanticReport, f as ClassConflict, g as ClassUsage, h as analyzeWorkspace } from './analyzeWorkspace-DuJKh7Ty.mjs';
1
+ import { C as ClassToCssOptions, a as ClassToCssResult, c as collectClassCounts, b as buildDistribution } from './analyzeWorkspace-BS5O4rhC.mjs';
2
+ export { A as AnalyzerOptions, d as AnalyzerReport, e as AnalyzerSemanticReport, f as ClassConflict, g as ClassUsage, h as analyzeWorkspace } from './analyzeWorkspace-BS5O4rhC.mjs';
3
3
  import './schemas-DR-SLxZZ.mjs';
4
4
  import 'zod';
5
5
 
@@ -17,7 +17,9 @@ declare const classToCss: (input: string | string[], options?: ClassToCssOptions
17
17
  */
18
18
 
19
19
  declare const __internal: {
20
- normalizeClassInput: (input: string | string[]) => string[];
20
+ normalizeClassInput: (input: string | string[], _binding?: {
21
+ normalizeClassInput?: (s: string) => string[];
22
+ }) => string[];
21
23
  splitVariantAndBase: (className: string) => {
22
24
  variantKey: string;
23
25
  base: string;
@@ -1,5 +1,5 @@
1
- import { C as ClassToCssOptions, a as ClassToCssResult, c as collectClassCounts, b as buildDistribution } from './analyzeWorkspace-Ct_NTAWt.js';
2
- export { A as AnalyzerOptions, d as AnalyzerReport, e as AnalyzerSemanticReport, f as ClassConflict, g as ClassUsage, h as analyzeWorkspace } from './analyzeWorkspace-Ct_NTAWt.js';
1
+ import { C as ClassToCssOptions, a as ClassToCssResult, c as collectClassCounts, b as buildDistribution } from './analyzeWorkspace-DDOQdzzI.js';
2
+ export { A as AnalyzerOptions, d as AnalyzerReport, e as AnalyzerSemanticReport, f as ClassConflict, g as ClassUsage, h as analyzeWorkspace } from './analyzeWorkspace-DDOQdzzI.js';
3
3
  import './schemas-DR-SLxZZ.js';
4
4
  import 'zod';
5
5
 
@@ -17,7 +17,9 @@ declare const classToCss: (input: string | string[], options?: ClassToCssOptions
17
17
  */
18
18
 
19
19
  declare const __internal: {
20
- normalizeClassInput: (input: string | string[]) => string[];
20
+ normalizeClassInput: (input: string | string[], _binding?: {
21
+ normalizeClassInput?: (s: string) => string[];
22
+ }) => string[];
21
23
  splitVariantAndBase: (className: string) => {
22
24
  variantKey: string;
23
25
  base: string;