@cwcss/crosswind 0.1.5 → 0.2.0

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 (87) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +52 -0
  3. package/dist/bin/cli.js +14615 -0
  4. package/dist/build.d.ts +24 -0
  5. package/dist/config.d.ts +5 -0
  6. package/dist/generator.d.ts +31 -0
  7. package/dist/index.d.ts +10 -0
  8. package/dist/parser.d.ts +42 -0
  9. package/dist/plugin.d.ts +22 -0
  10. package/dist/preflight-forms.d.ts +5 -0
  11. package/dist/preflight.d.ts +2 -0
  12. package/dist/rules-advanced.d.ts +27 -0
  13. package/dist/rules-effects.d.ts +25 -0
  14. package/dist/rules-forms.d.ts +7 -0
  15. package/dist/rules-grid.d.ts +13 -0
  16. package/dist/rules-interactivity.d.ts +41 -0
  17. package/dist/rules-layout.d.ts +26 -0
  18. package/dist/rules-transforms.d.ts +33 -0
  19. package/dist/rules-typography.d.ts +41 -0
  20. package/dist/rules.d.ts +39 -0
  21. package/dist/scanner.d.ts +18 -0
  22. package/dist/src/index.js +12848 -0
  23. package/dist/transformer-compile-class.d.ts +37 -0
  24. package/{src/types.ts → dist/types.d.ts} +17 -86
  25. package/package.json +2 -16
  26. package/PLUGIN.md +0 -235
  27. package/benchmark/framework-comparison.bench.ts +0 -850
  28. package/bin/cli.ts +0 -365
  29. package/bin/crosswind +0 -0
  30. package/bin/headwind +0 -0
  31. package/build.ts +0 -8
  32. package/crosswind.config.ts +0 -9
  33. package/example/comprehensive.html +0 -70
  34. package/example/index.html +0 -21
  35. package/example/output.css +0 -236
  36. package/examples/plugin/README.md +0 -112
  37. package/examples/plugin/build.ts +0 -32
  38. package/examples/plugin/src/index.html +0 -34
  39. package/examples/plugin/src/index.ts +0 -7
  40. package/headwind +0 -2
  41. package/src/build.ts +0 -101
  42. package/src/config.ts +0 -529
  43. package/src/generator.ts +0 -2173
  44. package/src/index.ts +0 -10
  45. package/src/parser.ts +0 -1471
  46. package/src/plugin.ts +0 -118
  47. package/src/preflight-forms.ts +0 -229
  48. package/src/preflight.ts +0 -388
  49. package/src/rules-advanced.ts +0 -477
  50. package/src/rules-effects.ts +0 -461
  51. package/src/rules-forms.ts +0 -103
  52. package/src/rules-grid.ts +0 -241
  53. package/src/rules-interactivity.ts +0 -525
  54. package/src/rules-layout.ts +0 -385
  55. package/src/rules-transforms.ts +0 -412
  56. package/src/rules-typography.ts +0 -486
  57. package/src/rules.ts +0 -809
  58. package/src/scanner.ts +0 -84
  59. package/src/transformer-compile-class.ts +0 -275
  60. package/test/advanced-features.test.ts +0 -911
  61. package/test/arbitrary.test.ts +0 -396
  62. package/test/attributify.test.ts +0 -592
  63. package/test/bracket-syntax.test.ts +0 -1133
  64. package/test/build.test.ts +0 -99
  65. package/test/colors.test.ts +0 -934
  66. package/test/flexbox.test.ts +0 -669
  67. package/test/generator.test.ts +0 -597
  68. package/test/grid.test.ts +0 -584
  69. package/test/layout.test.ts +0 -404
  70. package/test/modifiers.test.ts +0 -417
  71. package/test/parser.test.ts +0 -564
  72. package/test/performance-regression.test.ts +0 -376
  73. package/test/performance.test.ts +0 -568
  74. package/test/plugin.test.ts +0 -160
  75. package/test/scanner.test.ts +0 -94
  76. package/test/sizing.test.ts +0 -481
  77. package/test/spacing.test.ts +0 -394
  78. package/test/transformer-compile-class.test.ts +0 -287
  79. package/test/transforms.test.ts +0 -448
  80. package/test/typography.test.ts +0 -632
  81. package/test/variants-form-states.test.ts +0 -225
  82. package/test/variants-group-peer.test.ts +0 -66
  83. package/test/variants-media.test.ts +0 -213
  84. package/test/variants-positional.test.ts +0 -58
  85. package/test/variants-pseudo-elements.test.ts +0 -47
  86. package/test/variants-state.test.ts +0 -62
  87. package/tsconfig.json +0 -18
@@ -1,412 +0,0 @@
1
- import type { UtilityRule } from './rules'
2
-
3
- // Transform, Transition, Animation utilities
4
-
5
- export const transformRule: UtilityRule = (parsed) => {
6
- const values: Record<string, string> = {
7
- 'transform': 'translate(var(--hw-translate-x), var(--hw-translate-y)) rotate(var(--hw-rotate)) skewX(var(--hw-skew-x)) skewY(var(--hw-skew-y)) scaleX(var(--hw-scale-x)) scaleY(var(--hw-scale-y))',
8
- 'transform-cpu': 'translate(var(--hw-translate-x), var(--hw-translate-y)) rotate(var(--hw-rotate)) skewX(var(--hw-skew-x)) skewY(var(--hw-skew-y)) scaleX(var(--hw-scale-x)) scaleY(var(--hw-scale-y))',
9
- 'transform-gpu': 'translate3d(var(--hw-translate-x), var(--hw-translate-y), 0) rotate(var(--hw-rotate)) skewX(var(--hw-skew-x)) skewY(var(--hw-skew-y)) scaleX(var(--hw-scale-x)) scaleY(var(--hw-scale-y))',
10
- 'transform-none': 'none',
11
- }
12
- return values[parsed.raw] ? { transform: values[parsed.raw] } : undefined
13
- }
14
-
15
- export const scaleRule: UtilityRule = (parsed) => {
16
- if (parsed.utility === 'scale') {
17
- if (!parsed.value)
18
- return { transform: 'scale(1)' }
19
- // If arbitrary, use value as-is
20
- if (parsed.arbitrary) {
21
- return { transform: `scale(${parsed.value})` }
22
- }
23
- const scale = Number(parsed.value) / 100
24
- return { transform: `scale(${scale})` }
25
- }
26
- if (parsed.utility === 'scale-x') {
27
- if (!parsed.value)
28
- return { transform: 'scaleX(1)' }
29
- if (parsed.arbitrary) {
30
- return { transform: `scaleX(${parsed.value})` }
31
- }
32
- const scale = Number(parsed.value) / 100
33
- return { transform: `scaleX(${scale})` }
34
- }
35
- if (parsed.utility === 'scale-y') {
36
- if (!parsed.value)
37
- return { transform: 'scaleY(1)' }
38
- if (parsed.arbitrary) {
39
- return { transform: `scaleY(${parsed.value})` }
40
- }
41
- const scale = Number(parsed.value) / 100
42
- return { transform: `scaleY(${scale})` }
43
- }
44
- if (parsed.utility === 'scale-z') {
45
- if (!parsed.value)
46
- return { transform: 'scaleZ(1)' }
47
- if (parsed.arbitrary) {
48
- return { transform: `scaleZ(${parsed.value})` }
49
- }
50
- const scale = Number(parsed.value) / 100
51
- return { transform: `scaleZ(${scale})` }
52
- }
53
- }
54
-
55
- export const rotateRule: UtilityRule = (parsed) => {
56
- if (parsed.utility === 'rotate' && parsed.value) {
57
- // If arbitrary or already has unit, use as-is, otherwise add deg
58
- const value = parsed.arbitrary || parsed.value.includes('deg') || parsed.value.includes('rad') || parsed.value.includes('turn')
59
- ? parsed.value
60
- : `${parsed.value}deg`
61
- return { transform: `rotate(${value})` }
62
- }
63
- if (parsed.utility === 'rotate-x' && parsed.value) {
64
- const value = parsed.arbitrary || parsed.value.includes('deg') || parsed.value.includes('rad') || parsed.value.includes('turn')
65
- ? parsed.value
66
- : `${parsed.value}deg`
67
- return { transform: `rotateX(${value})` }
68
- }
69
- if (parsed.utility === 'rotate-y' && parsed.value) {
70
- const value = parsed.arbitrary || parsed.value.includes('deg') || parsed.value.includes('rad') || parsed.value.includes('turn')
71
- ? parsed.value
72
- : `${parsed.value}deg`
73
- return { transform: `rotateY(${value})` }
74
- }
75
- if (parsed.utility === 'rotate-z' && parsed.value) {
76
- const value = parsed.arbitrary || parsed.value.includes('deg') || parsed.value.includes('rad') || parsed.value.includes('turn')
77
- ? parsed.value
78
- : `${parsed.value}deg`
79
- return { transform: `rotateZ(${value})` }
80
- }
81
- }
82
-
83
- export const translateRule: UtilityRule = (parsed, config) => {
84
- const getTranslateValue = (val: string): string => {
85
- // Handle fractions: 1/2 -> 50%, 1/3 -> 33.333333%, etc.
86
- if (val.includes('/')) {
87
- const [num, denom] = val.split('/')
88
- const percentage = (Number(num) / Number(denom)) * 100
89
- return `${percentage}%`
90
- }
91
- // Handle special keywords
92
- if (val === 'full')
93
- return '100%'
94
- if (val === 'half')
95
- return '50%'
96
- // Check spacing config
97
- return config.theme.spacing[val] || val
98
- }
99
-
100
- if (parsed.utility === 'translate-x' && parsed.value) {
101
- let value: string
102
- if (parsed.value.startsWith('-')) {
103
- const positiveValue = parsed.value.slice(1)
104
- value = `-${getTranslateValue(positiveValue)}`
105
- }
106
- else {
107
- value = getTranslateValue(parsed.value)
108
- }
109
- return { transform: `translateX(${value})` }
110
- }
111
- if (parsed.utility === 'translate-y' && parsed.value) {
112
- let value: string
113
- if (parsed.value.startsWith('-')) {
114
- const positiveValue = parsed.value.slice(1)
115
- value = `-${getTranslateValue(positiveValue)}`
116
- }
117
- else {
118
- value = getTranslateValue(parsed.value)
119
- }
120
- return { transform: `translateY(${value})` }
121
- }
122
- if (parsed.utility === 'translate-z' && parsed.value) {
123
- let value: string
124
- if (parsed.value.startsWith('-')) {
125
- const positiveValue = parsed.value.slice(1)
126
- value = `-${getTranslateValue(positiveValue)}`
127
- }
128
- else {
129
- value = getTranslateValue(parsed.value)
130
- }
131
- return { transform: `translateZ(${value})` }
132
- }
133
- }
134
-
135
- export const skewRule: UtilityRule = (parsed) => {
136
- if (parsed.utility === 'skew-x' && parsed.value) {
137
- const value = parsed.arbitrary || parsed.value.includes('deg') || parsed.value.includes('rad') || parsed.value.includes('turn')
138
- ? parsed.value
139
- : `${parsed.value}deg`
140
- return { transform: `skewX(${value})` }
141
- }
142
- if (parsed.utility === 'skew-y' && parsed.value) {
143
- const value = parsed.arbitrary || parsed.value.includes('deg') || parsed.value.includes('rad') || parsed.value.includes('turn')
144
- ? parsed.value
145
- : `${parsed.value}deg`
146
- return { transform: `skewY(${value})` }
147
- }
148
- }
149
-
150
- export const transformOriginRule: UtilityRule = (parsed) => {
151
- if (parsed.utility === 'origin' && parsed.value) {
152
- // Handle arbitrary values with underscores as spaces
153
- if (parsed.arbitrary) {
154
- return { 'transform-origin': parsed.value.replace(/_/g, ' ') }
155
- }
156
- // Handle predefined values
157
- const origins: Record<string, string> = {
158
- 'center': 'center',
159
- 'top': 'top',
160
- 'top-right': 'top right',
161
- 'right': 'right',
162
- 'bottom-right': 'bottom right',
163
- 'bottom': 'bottom',
164
- 'bottom-left': 'bottom left',
165
- 'left': 'left',
166
- 'top-left': 'top left',
167
- }
168
- return origins[parsed.value] ? { 'transform-origin': origins[parsed.value] } : undefined
169
- }
170
- return undefined
171
- }
172
-
173
- export const perspectiveRule: UtilityRule = (parsed) => {
174
- if (parsed.utility === 'perspective' && parsed.value) {
175
- // If value is 'none', use as-is
176
- if (parsed.value === 'none') {
177
- return { perspective: 'none' }
178
- }
179
- // If arbitrary or already has unit, use as-is
180
- if (parsed.arbitrary || parsed.value.includes('px') || parsed.value.includes('rem') || parsed.value.includes('em')) {
181
- return { perspective: parsed.value }
182
- }
183
- // Otherwise add px
184
- return { perspective: `${parsed.value}px` }
185
- }
186
- return undefined
187
- }
188
-
189
- export const perspectiveOriginRule: UtilityRule = (parsed) => {
190
- if (parsed.utility === 'perspective-origin' && parsed.value) {
191
- const origins: Record<string, string> = {
192
- 'center': 'center',
193
- 'top': 'top',
194
- 'top-right': 'top right',
195
- 'right': 'right',
196
- 'bottom-right': 'bottom right',
197
- 'bottom': 'bottom',
198
- 'bottom-left': 'bottom left',
199
- 'left': 'left',
200
- 'top-left': 'top left',
201
- }
202
- return { 'perspective-origin': origins[parsed.value] || parsed.value }
203
- }
204
- }
205
-
206
- export const backfaceVisibilityRule: UtilityRule = (parsed) => {
207
- const values: Record<string, string> = {
208
- 'backface-visible': 'visible',
209
- 'backface-hidden': 'hidden',
210
- }
211
- return values[parsed.raw] ? { 'backface-visibility': values[parsed.raw] } : undefined
212
- }
213
-
214
- export const transformStyleRule: UtilityRule = (parsed) => {
215
- const values: Record<string, string> = {
216
- 'transform-flat': 'flat',
217
- 'transform-3d': 'preserve-3d',
218
- }
219
- return values[parsed.raw] ? { 'transform-style': values[parsed.raw] } : undefined
220
- }
221
-
222
- // Transition utilities
223
- export const transitionPropertyRule: UtilityRule = (parsed) => {
224
- const properties: Record<string, string> = {
225
- 'transition-none': 'none',
226
- 'transition-all': 'all',
227
- 'transition': 'color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter',
228
- 'transition-colors': 'color, background-color, border-color, text-decoration-color, fill, stroke',
229
- 'transition-opacity': 'opacity',
230
- 'transition-shadow': 'box-shadow',
231
- 'transition-transform': 'transform',
232
- }
233
- return properties[parsed.raw] ? { 'transition-property': properties[parsed.raw] } : undefined
234
- }
235
-
236
- export const transitionDurationRule: UtilityRule = (parsed) => {
237
- if (parsed.utility === 'duration' && parsed.value) {
238
- // Named duration presets (like Tailwind)
239
- const durations: Record<string, string> = {
240
- '0': '0s',
241
- '75': '75ms',
242
- '100': '100ms',
243
- '150': '150ms',
244
- '200': '200ms',
245
- '300': '300ms',
246
- '500': '500ms',
247
- '700': '700ms',
248
- '1000': '1000ms',
249
- }
250
- return { 'transition-duration': durations[parsed.value] || `${parsed.value}ms` }
251
- }
252
- }
253
-
254
- export const transitionTimingRule: UtilityRule = (parsed) => {
255
- const timings: Record<string, string> = {
256
- 'ease-linear': 'linear',
257
- 'ease-in': 'cubic-bezier(0.4, 0, 1, 1)',
258
- 'ease-out': 'cubic-bezier(0, 0, 0.2, 1)',
259
- 'ease-in-out': 'cubic-bezier(0.4, 0, 0.2, 1)',
260
- }
261
- return timings[parsed.raw] ? { 'transition-timing-function': timings[parsed.raw] } : undefined
262
- }
263
-
264
- export const transitionDelayRule: UtilityRule = (parsed) => {
265
- if (parsed.utility === 'delay' && parsed.value) {
266
- // Named delay presets (like Tailwind)
267
- const delays: Record<string, string> = {
268
- '0': '0s',
269
- '75': '75ms',
270
- '100': '100ms',
271
- '150': '150ms',
272
- '200': '200ms',
273
- '300': '300ms',
274
- '500': '500ms',
275
- '700': '700ms',
276
- '1000': '1000ms',
277
- }
278
- return { 'transition-delay': delays[parsed.value] || `${parsed.value}ms` }
279
- }
280
- }
281
-
282
- export const transitionBehaviorRule: UtilityRule = (parsed) => {
283
- const values: Record<string, string> = {
284
- 'transition-behavior-normal': 'normal',
285
- 'transition-behavior-allow-discrete': 'allow-discrete',
286
- }
287
- return values[parsed.raw] ? { 'transition-behavior': values[parsed.raw] } : undefined
288
- }
289
-
290
- export const animationRule: UtilityRule = (parsed) => {
291
- if (parsed.utility !== 'animate') {
292
- return undefined
293
- }
294
-
295
- const animations: Record<string, string> = {
296
- none: 'none',
297
- spin: 'spin 1s linear infinite',
298
- ping: 'ping 1s cubic-bezier(0, 0, 0.2, 1) infinite',
299
- pulse: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite',
300
- bounce: 'bounce 1s infinite',
301
- }
302
-
303
- // Support arbitrary animation values
304
- if (parsed.arbitrary && parsed.value) {
305
- // Replace underscores with spaces for arbitrary animation values
306
- return { animation: parsed.value.replace(/_/g, ' ') }
307
- }
308
-
309
- // Support predefined animations
310
- if (parsed.value && animations[parsed.value]) {
311
- return { animation: animations[parsed.value] }
312
- }
313
-
314
- return undefined
315
- }
316
-
317
- // Animation play state
318
- export const animationPlayStateRule: UtilityRule = (parsed) => {
319
- const values: Record<string, string> = {
320
- 'animate-running': 'running',
321
- 'animate-paused': 'paused',
322
- }
323
- return values[parsed.raw] ? { 'animation-play-state': values[parsed.raw] } : undefined
324
- }
325
-
326
- // Animation direction
327
- export const animationDirectionRule: UtilityRule = (parsed) => {
328
- const values: Record<string, string> = {
329
- 'animate-normal': 'normal',
330
- 'animate-reverse': 'reverse',
331
- 'animate-alternate': 'alternate',
332
- 'animate-alternate-reverse': 'alternate-reverse',
333
- }
334
- return values[parsed.raw] ? { 'animation-direction': values[parsed.raw] } : undefined
335
- }
336
-
337
- // Animation fill mode
338
- export const animationFillModeRule: UtilityRule = (parsed) => {
339
- const values: Record<string, string> = {
340
- 'animate-fill-none': 'none',
341
- 'animate-fill-forwards': 'forwards',
342
- 'animate-fill-backwards': 'backwards',
343
- 'animate-fill-both': 'both',
344
- }
345
- return values[parsed.raw] ? { 'animation-fill-mode': values[parsed.raw] } : undefined
346
- }
347
-
348
- // Animation iteration count
349
- export const animationIterationRule: UtilityRule = (parsed) => {
350
- if (parsed.utility === 'animate-iteration' && parsed.value) {
351
- return { 'animation-iteration-count': parsed.value === 'infinite' ? 'infinite' : parsed.value }
352
- }
353
- }
354
-
355
- // Animation duration
356
- export const animationDurationRule: UtilityRule = (parsed) => {
357
- if (parsed.utility === 'animate-duration' && parsed.value) {
358
- const durations: Record<string, string> = {
359
- '75': '75ms', '100': '100ms', '150': '150ms', '200': '200ms',
360
- '300': '300ms', '500': '500ms', '700': '700ms', '1000': '1000ms',
361
- }
362
- return { 'animation-duration': durations[parsed.value] || `${parsed.value}ms` }
363
- }
364
- }
365
-
366
- // Animation delay
367
- export const animationDelayRule: UtilityRule = (parsed) => {
368
- if (parsed.utility === 'animate-delay' && parsed.value) {
369
- const delays: Record<string, string> = {
370
- '75': '75ms', '100': '100ms', '150': '150ms', '200': '200ms',
371
- '300': '300ms', '500': '500ms', '700': '700ms', '1000': '1000ms',
372
- }
373
- return { 'animation-delay': delays[parsed.value] || `${parsed.value}ms` }
374
- }
375
- }
376
-
377
- // Animation timing function
378
- export const animationTimingRule: UtilityRule = (parsed) => {
379
- const values: Record<string, string> = {
380
- 'animate-ease-linear': 'linear',
381
- 'animate-ease-in': 'cubic-bezier(0.4, 0, 1, 1)',
382
- 'animate-ease-out': 'cubic-bezier(0, 0, 0.2, 1)',
383
- 'animate-ease-in-out': 'cubic-bezier(0.4, 0, 0.2, 1)',
384
- }
385
- return values[parsed.raw] ? { 'animation-timing-function': values[parsed.raw] } : undefined
386
- }
387
-
388
- export const transformsRules: UtilityRule[] = [
389
- transformRule,
390
- scaleRule,
391
- rotateRule,
392
- translateRule,
393
- skewRule,
394
- transformOriginRule,
395
- perspectiveRule,
396
- perspectiveOriginRule,
397
- backfaceVisibilityRule,
398
- transformStyleRule,
399
- transitionPropertyRule,
400
- transitionBehaviorRule,
401
- transitionDurationRule,
402
- transitionTimingRule,
403
- transitionDelayRule,
404
- animationRule,
405
- animationPlayStateRule,
406
- animationDirectionRule,
407
- animationFillModeRule,
408
- animationIterationRule,
409
- animationDurationRule,
410
- animationDelayRule,
411
- animationTimingRule,
412
- ]