@cwcss/crosswind 0.1.5 → 0.1.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.
Files changed (86) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +390 -0
  3. package/dist/build.d.ts +24 -0
  4. package/dist/config.d.ts +5 -0
  5. package/dist/generator.d.ts +31 -0
  6. package/dist/index.d.ts +10 -0
  7. package/dist/index.js +12798 -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/transformer-compile-class.d.ts +37 -0
  23. package/{src/types.ts → dist/types.d.ts} +17 -86
  24. package/package.json +1 -1
  25. package/PLUGIN.md +0 -235
  26. package/benchmark/framework-comparison.bench.ts +0 -850
  27. package/bin/cli.ts +0 -365
  28. package/bin/crosswind +0 -0
  29. package/bin/headwind +0 -0
  30. package/build.ts +0 -8
  31. package/crosswind.config.ts +0 -9
  32. package/example/comprehensive.html +0 -70
  33. package/example/index.html +0 -21
  34. package/example/output.css +0 -236
  35. package/examples/plugin/README.md +0 -112
  36. package/examples/plugin/build.ts +0 -32
  37. package/examples/plugin/src/index.html +0 -34
  38. package/examples/plugin/src/index.ts +0 -7
  39. package/headwind +0 -2
  40. package/src/build.ts +0 -101
  41. package/src/config.ts +0 -529
  42. package/src/generator.ts +0 -2173
  43. package/src/index.ts +0 -10
  44. package/src/parser.ts +0 -1471
  45. package/src/plugin.ts +0 -118
  46. package/src/preflight-forms.ts +0 -229
  47. package/src/preflight.ts +0 -388
  48. package/src/rules-advanced.ts +0 -477
  49. package/src/rules-effects.ts +0 -461
  50. package/src/rules-forms.ts +0 -103
  51. package/src/rules-grid.ts +0 -241
  52. package/src/rules-interactivity.ts +0 -525
  53. package/src/rules-layout.ts +0 -385
  54. package/src/rules-transforms.ts +0 -412
  55. package/src/rules-typography.ts +0 -486
  56. package/src/rules.ts +0 -809
  57. package/src/scanner.ts +0 -84
  58. package/src/transformer-compile-class.ts +0 -275
  59. package/test/advanced-features.test.ts +0 -911
  60. package/test/arbitrary.test.ts +0 -396
  61. package/test/attributify.test.ts +0 -592
  62. package/test/bracket-syntax.test.ts +0 -1133
  63. package/test/build.test.ts +0 -99
  64. package/test/colors.test.ts +0 -934
  65. package/test/flexbox.test.ts +0 -669
  66. package/test/generator.test.ts +0 -597
  67. package/test/grid.test.ts +0 -584
  68. package/test/layout.test.ts +0 -404
  69. package/test/modifiers.test.ts +0 -417
  70. package/test/parser.test.ts +0 -564
  71. package/test/performance-regression.test.ts +0 -376
  72. package/test/performance.test.ts +0 -568
  73. package/test/plugin.test.ts +0 -160
  74. package/test/scanner.test.ts +0 -94
  75. package/test/sizing.test.ts +0 -481
  76. package/test/spacing.test.ts +0 -394
  77. package/test/transformer-compile-class.test.ts +0 -287
  78. package/test/transforms.test.ts +0 -448
  79. package/test/typography.test.ts +0 -632
  80. package/test/variants-form-states.test.ts +0 -225
  81. package/test/variants-group-peer.test.ts +0 -66
  82. package/test/variants-media.test.ts +0 -213
  83. package/test/variants-positional.test.ts +0 -58
  84. package/test/variants-pseudo-elements.test.ts +0 -47
  85. package/test/variants-state.test.ts +0 -62
  86. 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
- ]