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.
- package/CHANGELOG.md +204 -416
- package/README.md +45 -15
- package/dist/{analyzeWorkspace-DuJKh7Ty.d.mts → analyzeWorkspace-BS5O4rhC.d.mts} +47 -2
- package/dist/{analyzeWorkspace-Ct_NTAWt.d.ts → analyzeWorkspace-DDOQdzzI.d.ts} +47 -2
- package/dist/analyzer.d.mts +5 -3
- package/dist/analyzer.d.ts +5 -3
- package/dist/analyzer.js +563 -468
- package/dist/analyzer.js.map +1 -1
- package/dist/analyzer.mjs +562 -467
- package/dist/analyzer.mjs.map +1 -1
- package/dist/animate.d.mts +4 -7
- package/dist/animate.d.ts +4 -7
- package/dist/animate.js +171 -265
- package/dist/animate.js.map +1 -1
- package/dist/animate.mjs +165 -264
- package/dist/animate.mjs.map +1 -1
- package/dist/atomic.d.mts +22 -1
- package/dist/atomic.d.ts +22 -1
- package/dist/atomic.js +221 -165
- package/dist/atomic.js.map +1 -1
- package/dist/atomic.mjs +200 -165
- package/dist/atomic.mjs.map +1 -1
- package/dist/cli.d.mts +60 -1
- package/dist/cli.d.ts +60 -1
- package/dist/cli.js +1261 -1517
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +1238 -1513
- package/dist/cli.mjs.map +1 -1
- package/dist/compiler.d.mts +38 -7
- package/dist/compiler.d.ts +38 -7
- package/dist/compiler.js +174 -197
- package/dist/compiler.js.map +1 -1
- package/dist/compiler.mjs +151 -194
- package/dist/compiler.mjs.map +1 -1
- package/dist/devtools.js +7 -31
- package/dist/devtools.js.map +1 -1
- package/dist/devtools.mjs +7 -31
- package/dist/devtools.mjs.map +1 -1
- package/dist/engine.d.mts +134 -63
- package/dist/engine.d.ts +134 -63
- package/dist/engine.js +2863 -2482
- package/dist/engine.js.map +1 -1
- package/dist/engine.mjs +2852 -2485
- package/dist/engine.mjs.map +1 -1
- package/dist/{index-eWAocnD2.d.mts → index-NDINUhLN.d.mts} +3 -1
- package/dist/{index-eWAocnD2.d.ts → index-NDINUhLN.d.ts} +3 -1
- package/dist/index.d.mts +63 -32
- package/dist/index.d.ts +63 -32
- package/dist/index.js +335 -169
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +315 -169
- package/dist/index.mjs.map +1 -1
- package/dist/{liveTokenEngine-DSUk88P6.d.ts → liveTokenEngine-CN9ian1R.d.ts} +1 -1
- package/dist/{liveTokenEngine-CX5_0c4q.d.mts → liveTokenEngine-DKoWRtqH.d.mts} +1 -1
- package/dist/next.d.mts +10 -4
- package/dist/next.d.ts +10 -4
- package/dist/next.js +32 -45
- package/dist/next.js.map +1 -1
- package/dist/next.mjs +30 -43
- package/dist/next.mjs.map +1 -1
- package/dist/plugin-api.d.mts +8 -2
- package/dist/plugin-api.d.ts +8 -2
- package/dist/plugin-api.js +14 -2
- package/dist/plugin-api.js.map +1 -1
- package/dist/plugin-api.mjs +14 -3
- package/dist/plugin-api.mjs.map +1 -1
- package/dist/plugin-registry.js +51 -11
- package/dist/plugin-registry.js.map +1 -1
- package/dist/plugin-registry.mjs +51 -11
- package/dist/plugin-registry.mjs.map +1 -1
- package/dist/plugin.d.mts +5 -7
- package/dist/plugin.d.ts +5 -7
- package/dist/plugin.js +16 -15
- package/dist/plugin.js.map +1 -1
- package/dist/plugin.mjs +16 -16
- package/dist/plugin.mjs.map +1 -1
- package/dist/rspack.js +17 -38
- package/dist/rspack.js.map +1 -1
- package/dist/rspack.mjs +15 -36
- package/dist/rspack.mjs.map +1 -1
- package/dist/runtime.d.mts +2 -2
- package/dist/runtime.d.ts +2 -2
- package/dist/scanner.d.mts +10 -1
- package/dist/scanner.d.ts +10 -1
- package/dist/scanner.js +298 -124
- package/dist/scanner.js.map +1 -1
- package/dist/scanner.mjs +296 -124
- package/dist/scanner.mjs.map +1 -1
- package/dist/shared.d.mts +1 -1
- package/dist/shared.d.ts +1 -1
- package/dist/shared.js +104 -176
- package/dist/shared.js.map +1 -1
- package/dist/shared.mjs +85 -176
- package/dist/shared.mjs.map +1 -1
- package/dist/storybook-addon.d.mts +1 -1
- package/dist/storybook-addon.d.ts +1 -1
- package/dist/svelte.d.mts +1 -1
- package/dist/svelte.d.ts +1 -1
- package/dist/svelte.js +166 -3
- package/dist/svelte.js.map +1 -1
- package/dist/svelte.mjs +143 -1
- package/dist/svelte.mjs.map +1 -1
- package/dist/syntax.js +21 -21
- package/dist/syntax.js.map +1 -1
- package/dist/syntax.mjs +21 -21
- package/dist/syntax.mjs.map +1 -1
- package/dist/testing.js +9 -1
- package/dist/testing.js.map +1 -1
- package/dist/testing.mjs +9 -1
- package/dist/testing.mjs.map +1 -1
- package/dist/theme.d.mts +2 -2
- package/dist/theme.d.ts +2 -2
- package/dist/theme.js +40 -112
- package/dist/theme.js.map +1 -1
- package/dist/theme.mjs +37 -110
- package/dist/theme.mjs.map +1 -1
- package/dist/turbopackLoader.js +84 -126
- package/dist/turbopackLoader.js.map +1 -1
- package/dist/turbopackLoader.mjs +68 -124
- package/dist/turbopackLoader.mjs.map +1 -1
- package/dist/tw.js +1256 -1517
- package/dist/tw.js.map +1 -1
- package/dist/tw.mjs +1236 -1513
- package/dist/tw.mjs.map +1 -1
- package/dist/vite.js +1783 -823
- package/dist/vite.js.map +1 -1
- package/dist/vite.mjs +1767 -821
- package/dist/vite.mjs.map +1 -1
- package/dist/vue.d.mts +1 -1
- package/dist/vue.d.ts +1 -1
- package/dist/vue.js +165 -4
- package/dist/vue.js.map +1 -1
- package/dist/vue.mjs +141 -1
- package/dist/vue.mjs.map +1 -1
- package/dist/webpackLoader.js +69 -108
- package/dist/webpackLoader.js.map +1 -1
- package/dist/webpackLoader.mjs +49 -104
- package/dist/webpackLoader.mjs.map +1 -1
- package/native/tailwind-styled-native.node +0 -0
- 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
|
|
145
|
+
### 6. Sub-components
|
|
146
146
|
|
|
147
|
-
|
|
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
|
|
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
|
-
>
|
|
189
|
+
> Sub-components **tidak mewarisi** style base. Untuk mewarisi, pakai `.extend()` (lihat Pattern B di bawah).
|
|
168
190
|
|
|
169
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
|
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.
|
package/dist/analyzer.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { C as ClassToCssOptions, a as ClassToCssResult, c as collectClassCounts, b as buildDistribution } from './analyzeWorkspace-
|
|
2
|
-
export { A as AnalyzerOptions, d as AnalyzerReport, e as AnalyzerSemanticReport, f as ClassConflict, g as ClassUsage, h as analyzeWorkspace } from './analyzeWorkspace-
|
|
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[]
|
|
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;
|
package/dist/analyzer.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { C as ClassToCssOptions, a as ClassToCssResult, c as collectClassCounts, b as buildDistribution } from './analyzeWorkspace-
|
|
2
|
-
export { A as AnalyzerOptions, d as AnalyzerReport, e as AnalyzerSemanticReport, f as ClassConflict, g as ClassUsage, h as analyzeWorkspace } from './analyzeWorkspace-
|
|
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[]
|
|
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;
|