1mpacto-sass 0.0.2 → 0.0.4

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/_engine.scss CHANGED
@@ -599,6 +599,7 @@ $browser-prefixes: (
599
599
  $whitelist-responsive,
600
600
  $whitelist-hover,
601
601
  $whitelist-focus,
602
+ $whitelist-placeholder,
602
603
  $class-prefix: '',
603
604
  $var-prefix: ''
604
605
 
@@ -646,4 +647,35 @@ $browser-prefixes: (
646
647
  @include generate-utility($class, $static-map, $dynamic-map, $var-prefix);
647
648
  }
648
649
  }
650
+
651
+ // 5. Placeholder
652
+ @each $class in $whitelist-placeholder {
653
+ $prefixed-class: apply-class-prefix($class, $class-prefix);
654
+ $selector-base: escape-classname('placeholder:' + $prefixed-class);
655
+
656
+ // Webkit
657
+ .#{$selector-base}::-webkit-input-placeholder {
658
+ @include generate-utility($class, $static-map, $dynamic-map, $var-prefix);
659
+ }
660
+
661
+ // Moz
662
+ .#{$selector-base}::-moz-placeholder {
663
+ @include generate-utility($class, $static-map, $dynamic-map, $var-prefix);
664
+ }
665
+
666
+ // IE 10+
667
+ .#{$selector-base}:-ms-input-placeholder {
668
+ @include generate-utility($class, $static-map, $dynamic-map, $var-prefix);
669
+ }
670
+
671
+ // Edge
672
+ .#{$selector-base}::-ms-input-placeholder {
673
+ @include generate-utility($class, $static-map, $dynamic-map, $var-prefix);
674
+ }
675
+
676
+ // Standard
677
+ .#{$selector-base}::placeholder {
678
+ @include generate-utility($class, $static-map, $dynamic-map, $var-prefix);
679
+ }
680
+ }
649
681
  }
package/_preflight.scss CHANGED
@@ -4,11 +4,13 @@
4
4
  @mixin preflight($font-family-map: (), $border-color: #e5e7eb) {
5
5
  // RESOLVE FONTS
6
6
  $sans-font: map.get($font-family-map, 'sans');
7
+
7
8
  @if not $sans-font {
8
9
  $sans-font: (ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");
9
10
  }
10
11
 
11
12
  $mono-font: map.get($font-family-map, 'mono');
13
+
12
14
  @if not $mono-font {
13
15
  $mono-font: (ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
14
16
  }
@@ -26,10 +28,14 @@
26
28
  *,
27
29
  ::before,
28
30
  ::after {
29
- box-sizing: border-box; /* 1 */
30
- border-width: 0; /* 2 */
31
- border-style: solid; /* 2 */
32
- border-color: #{$border-color}; /* 2 */
31
+ box-sizing: border-box;
32
+ /* 1 */
33
+ border-width: 0;
34
+ /* 2 */
35
+ border-style: solid;
36
+ /* 2 */
37
+ border-color: #{$border-color};
38
+ /* 2 */
33
39
  }
34
40
 
35
41
  ::before,
@@ -49,14 +55,23 @@
49
55
 
50
56
  html,
51
57
  :host {
52
- line-height: 1.5; /* 1 */
53
- -webkit-text-size-adjust: 100%; /* 2 */
54
- -moz-tab-size: 4; /* 3 */
55
- tab-size: 4; /* 3 */
56
- font-family: $sans-font; /* 4 */
57
- font-feature-settings: normal; /* 5 */
58
- font-variation-settings: normal; /* 6 */
59
- -webkit-tap-highlight-color: transparent; /* 7 */
58
+ line-height: 1.5;
59
+ /* 1 */
60
+ -webkit-text-size-adjust: 100%;
61
+ /* 2 */
62
+ -moz-tab-size: 4;
63
+ /* 3 */
64
+ -o-tab-size: 4;
65
+ tab-size: 4;
66
+ /* 3 */
67
+ font-family: $sans-font;
68
+ /* 4 */
69
+ font-feature-settings: normal;
70
+ /* 5 */
71
+ font-variation-settings: normal;
72
+ /* 6 */
73
+ -webkit-tap-highlight-color: transparent;
74
+ /* 7 */
60
75
  }
61
76
 
62
77
  /*
@@ -65,8 +80,10 @@
65
80
  */
66
81
 
67
82
  body {
68
- margin: 0; /* 1 */
69
- line-height: inherit; /* 2 */
83
+ margin: 0;
84
+ /* 1 */
85
+ line-height: inherit;
86
+ /* 2 */
70
87
  }
71
88
 
72
89
  /*
@@ -76,9 +93,12 @@
76
93
  */
77
94
 
78
95
  hr {
79
- height: 0; /* 1 */
80
- color: inherit; /* 2 */
81
- border-top-width: 1px; /* 3 */
96
+ height: 0;
97
+ /* 1 */
98
+ color: inherit;
99
+ /* 2 */
100
+ border-top-width: 1px;
101
+ /* 3 */
82
102
  }
83
103
 
84
104
  /*
@@ -86,6 +106,7 @@
86
106
  */
87
107
 
88
108
  abbr:where([title]) {
109
+ -webkit-text-decoration: underline dotted;
89
110
  text-decoration: underline dotted;
90
111
  }
91
112
 
@@ -132,10 +153,14 @@
132
153
  kbd,
133
154
  samp,
134
155
  pre {
135
- font-family: $mono-font; /* 1 */
136
- font-feature-settings: normal; /* 2 */
137
- font-variation-settings: normal; /* 3 */
138
- font-size: 1em; /* 4 */
156
+ font-family: $mono-font;
157
+ /* 1 */
158
+ font-feature-settings: normal;
159
+ /* 2 */
160
+ font-variation-settings: normal;
161
+ /* 3 */
162
+ font-size: 1em;
163
+ /* 4 */
139
164
  }
140
165
 
141
166
  /*
@@ -173,9 +198,12 @@
173
198
  */
174
199
 
175
200
  table {
176
- text-indent: 0; /* 1 */
177
- border-color: inherit; /* 2 */
178
- border-collapse: collapse; /* 3 */
201
+ text-indent: 0;
202
+ /* 1 */
203
+ border-color: inherit;
204
+ /* 2 */
205
+ border-collapse: collapse;
206
+ /* 3 */
179
207
  }
180
208
 
181
209
  /*
@@ -189,15 +217,26 @@
189
217
  optgroup,
190
218
  select,
191
219
  textarea {
192
- font-family: inherit; /* 1 */
193
- font-feature-settings: inherit; /* 1 */
194
- font-variation-settings: inherit; /* 1 */
195
- font-size: 100%; /* 1 */
196
- font-weight: inherit; /* 1 */
197
- line-height: inherit; /* 1 */
198
- color: inherit; /* 1 */
199
- margin: 0; /* 2 */
200
- padding: 0; /* 3 */
220
+ font-family: inherit;
221
+ /* 1 */
222
+ font-feature-settings: inherit;
223
+ /* 1 */
224
+ font-variation-settings: inherit;
225
+ /* 1 */
226
+ font-size: 100%;
227
+ /* 1 */
228
+ font-weight: inherit;
229
+ /* 1 */
230
+ line-height: inherit;
231
+ /* 1 */
232
+ letter-spacing: inherit;
233
+ /* 1 */
234
+ color: inherit;
235
+ /* 1 */
236
+ margin: 0;
237
+ /* 2 */
238
+ padding: 0;
239
+ /* 3 */
201
240
  }
202
241
 
203
242
  /*
@@ -215,12 +254,15 @@
215
254
  */
216
255
 
217
256
  button,
218
- [type='button'],
219
- [type='reset'],
220
- [type='submit'] {
221
- -webkit-appearance: button; /* 1 */
222
- background-color: transparent; /* 2 */
223
- background-image: none; /* 2 */
257
+ input:where([type='button']),
258
+ input:where([type='reset']),
259
+ input:where([type='submit']) {
260
+ -webkit-appearance: button;
261
+ /* 1 */
262
+ background-color: transparent;
263
+ /* 2 */
264
+ background-image: none;
265
+ /* 2 */
224
266
  }
225
267
 
226
268
  /*
@@ -262,8 +304,10 @@
262
304
  */
263
305
 
264
306
  [type='search'] {
265
- -webkit-appearance: textfield; /* 1 */
266
- outline-offset: -2px; /* 2 */
307
+ -webkit-appearance: textfield;
308
+ /* 1 */
309
+ outline-offset: -2px;
310
+ /* 2 */
267
311
  }
268
312
 
269
313
  /*
@@ -280,8 +324,10 @@
280
324
  */
281
325
 
282
326
  ::-webkit-file-upload-button {
283
- -webkit-appearance: button; /* 1 */
284
- font: inherit; /* 2 */
327
+ -webkit-appearance: button;
328
+ /* 1 */
329
+ font: inherit;
330
+ /* 2 */
285
331
  }
286
332
 
287
333
  /*
@@ -349,10 +395,20 @@
349
395
  2. Set the default placeholder color to the user's configured gray 400 color.
350
396
  */
351
397
 
398
+ input::-moz-placeholder,
399
+ textarea::-moz-placeholder {
400
+ opacity: 1;
401
+ /* 1 */
402
+ color: #9ca3af;
403
+ /* 2 */
404
+ }
405
+
352
406
  input::placeholder,
353
407
  textarea::placeholder {
354
- opacity: 1; /* 1 */
355
- color: #9ca3af; /* 2 */
408
+ opacity: 1;
409
+ /* 1 */
410
+ color: #9ca3af;
411
+ /* 2 */
356
412
  }
357
413
 
358
414
  /*
@@ -386,8 +442,10 @@
386
442
  iframe,
387
443
  embed,
388
444
  object {
389
- display: block; /* 1 */
390
- vertical-align: middle; /* 2 */
445
+ display: block;
446
+ /* 1 */
447
+ vertical-align: middle;
448
+ /* 2 */
391
449
  }
392
450
 
393
451
  /*
@@ -404,4 +462,4 @@
404
462
  [hidden] {
405
463
  display: none;
406
464
  }
407
- }
465
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "1mpacto-sass",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "sass generator for css utility first",
5
5
  "type": "module",
6
6
  "exports": {
package/readme.md CHANGED
@@ -9,7 +9,7 @@ Generator ini dibuat sebagai pengganti Tailwind CSS untuk proyek yang membutuhka
9
9
  3. **Arbitrary Values**: Mendukung nilai kustom langsung di classname, contoh: `w-[500px]`, `m-[calc(100%+20px)]`.
10
10
  4. **Negative Values**: Mendukung nilai negatif dengan prefix `-`, contoh: `-m-4`, `-rotate-45`.
11
11
  5. **Important Modifier**: Mendukung prefix `!` untuk `!important`, contoh: `!p-4`.
12
- 6. **Responsive & States**: Mendukung breakpoint (`sm:`, `md:`, dll) dan state (`hover:`, `focus:`).
12
+ 6. **Responsive & States**: Mendukung breakpoint (`sm:`, `md:`, dll) dan state (`hover:`, `focus:`, `placeholder:`).
13
13
  7. **Namespace Isolation**: Mendukung prefix global untuk semua class (misal `1ru-`) dan variable CSS untuk mencegah konflik.
14
14
 
15
15
  ---
@@ -383,10 +383,11 @@ $whitelistresponsive: (
383
383
  ```
384
384
 
385
385
  ### State Classes
386
- Class untuk hover atau focus.
386
+ Class untuk hover, focus, atau placeholder.
387
387
  ```scss
388
388
  $whitelisthover: ('bg-gray-100', 'text-red-500'); // Menjadi .hover:bg-gray-100:hover
389
389
  $whitelistfocus: ('ring-2'); // Menjadi .focus:ring-2:focus
390
+ $whitelistplaceholder: ('text-gray-400'); // Menjadi .placeholder:text-gray-400::placeholder
390
391
  ```
391
392
 
392
393
  ---
@@ -552,6 +553,8 @@ $whitelisthover : ();
552
553
  // Whitelist Hover
553
554
  $whitelistfocus : ();
554
555
  // Whitelist Focus
556
+ $whitelistplaceholder : ();
557
+ // Whitelist Placeholder
555
558
 
556
559
 
557
560
  @include engine.generatorStyle(config.$static-utilities-map,
@@ -582,6 +585,7 @@ $whitelistfocus : ();
582
585
  $whitelistresponsive,
583
586
  $whitelisthover,
584
587
  $whitelistfocus,
588
+ $whitelistplaceholder,
585
589
  'my-prefix-', // Custom Class Prefix (param ke-8)
586
590
  'my-var-' // Custom Var Prefix (param ke-9)
587
591
  );
@@ -165,5 +165,6 @@ $test-cases-base: ( // --- STATIC UTILITIES ---
165
165
  $whitelist-responsive: ('sm': $test-cases-base, '2xl': $test-cases-base),
166
166
  $whitelist-hover: $test-cases-base,
167
167
  $whitelist-focus: $test-cases-base,
168
+ $whitelist-placeholder: $test-cases-base,
168
169
  $var-prefix: 'is'
169
170
  );
@@ -107,6 +107,9 @@ function parseRules(content) {
107
107
  } else if (cleanSelector.includes(':focus')) {
108
108
  variant = 'focus';
109
109
  cleanSelector = cleanSelector.replace(':focus', '');
110
+ } else if (cleanSelector.includes('::placeholder')) {
111
+ variant = 'placeholder';
112
+ cleanSelector = cleanSelector.replace('::placeholder', '');
110
113
  }
111
114
 
112
115
  // Remove leading dot
@@ -161,8 +164,8 @@ function assertRule(rules, testCase) {
161
164
  if (!checkProps(baseRule, testCase.expected, testCase.class, 'Base')) allVariantsPassed = false;
162
165
  }
163
166
 
164
- // 2. Validate Pseudo-classes (hover, focus)
165
- else if (variant === 'hover' || variant === 'focus') {
167
+ // 2. Validate Pseudo-classes (hover, focus, placeholder)
168
+ else if (variant === 'hover' || variant === 'focus' || variant === 'placeholder') {
166
169
  const pseudoClass = `${variant}:${testCase.class}`;
167
170
  const pseudoRule = rules.find(r => r.className === pseudoClass && r.variant === variant);
168
171
  if (!checkProps(pseudoRule, testCase.expected, pseudoClass, capitalize(variant))) allVariantsPassed = false;
@@ -222,90 +225,90 @@ function runTests() {
222
225
  // List of test cases covering all categories defined in integration.test.scss
223
226
  const testCases = [
224
227
  // --- STATIC UTILITIES ---
225
- { class: 'block', expected: { 'display': 'block' }, variants: ['base', 'hover', 'focus', 'sm', '2xl'] },
226
- { class: 'fixed', expected: { 'position': 'fixed' }, variants: ['base', 'hover', 'focus', 'sm'] },
227
- { class: 'flex-row', expected: { 'flex-direction': 'row' }, variants: ['base', 'hover', 'focus', 'sm'] },
228
- { class: 'items-center', expected: { 'align-items': 'center' }, variants: ['base', 'hover', 'focus', 'sm'] },
229
- { class: 'text-center', expected: { 'text-align': 'center' }, variants: ['base', 'hover', 'focus', 'sm'] },
230
- { class: 'border-none', expected: { 'border-style': 'none' }, variants: ['base', 'hover', 'focus', 'sm'] },
231
- { class: 'cursor-pointer', expected: { 'cursor': 'pointer' }, variants: ['base', 'hover', 'focus', 'sm'] },
232
- { class: 'truncate', expected: { 'overflow': 'hidden', 'text-overflow': 'ellipsis', 'white-space': 'nowrap' }, variants: ['base', 'hover', 'focus', 'sm'] },
233
- { class: 'flex-1', expected: { 'flex': '1 1 0%' }, variants: ['base', 'hover', 'focus', 'sm'] },
234
- { class: 'justify-between', expected: { 'justify-content': 'space-between' }, variants: ['base', 'hover', 'focus', 'sm'] },
235
- { class: 'uppercase', expected: { 'text-transform': 'uppercase' }, variants: ['base', 'hover', 'focus', 'sm'] },
236
- { class: 'underline', expected: { 'text-decoration': 'underline' }, variants: ['base', 'hover', 'focus', 'sm'] },
237
- { class: 'italic', expected: { 'font-style': 'italic' }, variants: ['base', 'hover', 'focus', 'sm'] },
238
- { class: 'list-disc', expected: { 'list-style-type': 'disc' }, variants: ['base', 'hover', 'focus', 'sm'] },
239
- { class: 'align-middle', expected: { 'vertical-align': 'middle' }, variants: ['base', 'hover', 'focus', 'sm'] },
240
- { class: 'overflow-hidden', expected: { 'overflow': 'hidden' }, variants: ['base', 'hover', 'focus', 'sm'] },
241
- { class: 'object-cover', expected: { 'object-fit': 'cover' }, variants: ['base', 'hover', 'focus', 'sm'] },
242
- { class: 'bg-cover', expected: { 'background-size': 'cover' }, variants: ['base', 'hover', 'focus', 'sm'] },
243
- { class: 'outline-none', expected: { 'outline': '2px solid transparent', 'outline-offset': '2px' }, variants: ['base', 'hover', 'focus', 'sm'] },
244
- { class: 'border-collapse', expected: { 'border-collapse': 'collapse' }, variants: ['base', 'hover', 'focus', 'sm'] },
245
- { class: 'select-none', expected: { 'user-select': 'none' }, variants: ['base', 'hover', 'focus', 'sm'] },
246
- { class: 'appearance-none', expected: { 'appearance': 'none' }, variants: ['base', 'hover', 'focus', 'sm'] },
228
+ { class: 'block', expected: { 'display': 'block' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm', '2xl'] },
229
+ { class: 'fixed', expected: { 'position': 'fixed' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
230
+ { class: 'flex-row', expected: { 'flex-direction': 'row' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
231
+ { class: 'items-center', expected: { 'align-items': 'center' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
232
+ { class: 'text-center', expected: { 'text-align': 'center' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
233
+ { class: 'border-none', expected: { 'border-style': 'none' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
234
+ { class: 'cursor-pointer', expected: { 'cursor': 'pointer' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
235
+ { class: 'truncate', expected: { 'overflow': 'hidden', 'text-overflow': 'ellipsis', 'white-space': 'nowrap' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
236
+ { class: 'flex-1', expected: { 'flex': '1 1 0%' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
237
+ { class: 'justify-between', expected: { 'justify-content': 'space-between' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
238
+ { class: 'uppercase', expected: { 'text-transform': 'uppercase' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
239
+ { class: 'underline', expected: { 'text-decoration': 'underline' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
240
+ { class: 'italic', expected: { 'font-style': 'italic' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
241
+ { class: 'list-disc', expected: { 'list-style-type': 'disc' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
242
+ { class: 'align-middle', expected: { 'vertical-align': 'middle' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
243
+ { class: 'overflow-hidden', expected: { 'overflow': 'hidden' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
244
+ { class: 'object-cover', expected: { 'object-fit': 'cover' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
245
+ { class: 'bg-cover', expected: { 'background-size': 'cover' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
246
+ { class: 'outline-none', expected: { 'outline': '2px solid transparent', 'outline-offset': '2px' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
247
+ { class: 'border-collapse', expected: { 'border-collapse': 'collapse' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
248
+ { class: 'select-none', expected: { 'user-select': 'none' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
249
+ { class: 'appearance-none', expected: { 'appearance': 'none' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
247
250
 
248
251
  // --- DYNAMIC UTILITIES (SPACING) ---
249
- { class: 'p-1', expected: { 'padding': '0.25rem' }, variants: ['base', 'hover', 'focus', 'sm'] },
250
- { class: 'px-1', expected: { 'padding-left': '0.25rem', 'padding-right': '0.25rem' }, variants: ['base', 'hover', 'focus', 'sm'] },
251
- { class: 'm-1', expected: { 'margin': '0.25rem' }, variants: ['base', 'hover', 'focus', 'sm'] },
252
- { class: '-m-1', expected: { 'margin': '-0.25rem' }, variants: ['base', 'hover', 'focus', 'sm'] },
252
+ { class: 'p-1', expected: { 'padding': '0.25rem' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
253
+ { class: 'px-1', expected: { 'padding-left': '0.25rem', 'padding-right': '0.25rem' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
254
+ { class: 'm-1', expected: { 'margin': '0.25rem' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
255
+ { class: '-m-1', expected: { 'margin': '-0.25rem' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
253
256
 
254
257
  // --- DYNAMIC UTILITIES (FLEX/GRID) ---
255
- { class: 'gap-1', expected: { 'gap': '0.25rem' }, variants: ['base', 'hover', 'focus', 'sm'] },
256
- { class: 'basis-1', expected: { 'flex-basis': '0.25rem' }, variants: ['base', 'hover', 'focus', 'sm'] },
257
- { class: 'order-1', expected: { 'order': '1' }, variants: ['base', 'hover', 'focus', 'sm'] },
258
+ { class: 'gap-1', expected: { 'gap': '0.25rem' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
259
+ { class: 'basis-1', expected: { 'flex-basis': '0.25rem' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
260
+ { class: 'order-1', expected: { 'order': '1' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
258
261
 
259
262
  // --- DYNAMIC UTILITIES (POSITIONING) ---
260
- { class: 'top-0', expected: { 'top': '0px' }, variants: ['base', 'hover', 'focus', 'sm'] },
261
- { class: 'inset-0', expected: { 'top': '0px', 'right': '0px', 'bottom': '0px', 'left': '0px' }, variants: ['base', 'hover', 'focus', 'sm'] },
263
+ { class: 'top-0', expected: { 'top': '0px' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
264
+ { class: 'inset-0', expected: { 'top': '0px', 'right': '0px', 'bottom': '0px', 'left': '0px' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
262
265
 
263
266
  // --- DYNAMIC UTILITIES (SIZING) ---
264
- { class: 'w-full', expected: { 'width': '100%' }, variants: ['base', 'hover', 'focus', 'sm'] },
265
- { class: 'h-screen', expected: { 'height': '100vh' }, variants: ['base', 'hover', 'focus', 'sm'] },
267
+ { class: 'w-full', expected: { 'width': '100%' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
268
+ { class: 'h-screen', expected: { 'height': '100vh' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
266
269
 
267
270
  // --- DYNAMIC UTILITIES (TYPOGRAPHY) ---
268
- { class: 'text-sm', expected: { 'font-size': '0.875rem', 'line-height': '1.25rem' }, variants: ['base', 'hover', 'focus', 'sm'] },
269
- { class: 'text-primary', expected: { 'color': '#007bff' }, variants: ['base', 'hover', 'focus', 'sm'] },
270
- { class: 'font-bold', expected: { 'font-weight': '700' }, variants: ['base', 'hover', 'focus', 'sm'] },
271
- { class: 'leading-4', expected: { 'line-height': '1rem' }, variants: ['base', 'hover', 'focus', 'sm'] },
272
- { class: 'tracking-wide', expected: { 'letter-spacing': '0.025em' }, variants: ['base', 'hover', 'focus', 'sm'] },
273
- { class: 'line-clamp-2', expected: { 'overflow': 'hidden', 'display': '-webkit-box', '-webkit-line-clamp': '2' }, variants: ['base', 'hover', 'focus', 'sm'] },
271
+ { class: 'text-sm', expected: { 'font-size': '0.875rem', 'line-height': '1.25rem' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
272
+ { class: 'text-primary', expected: { 'color': '#007bff' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
273
+ { class: 'font-bold', expected: { 'font-weight': '700' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
274
+ { class: 'leading-4', expected: { 'line-height': '1rem' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
275
+ { class: 'tracking-wide', expected: { 'letter-spacing': '0.025em' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
276
+ { class: 'line-clamp-2', expected: { 'overflow': 'hidden', 'display': '-webkit-box', '-webkit-line-clamp': '2' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
274
277
 
275
278
  // --- DYNAMIC UTILITIES (BACKGROUND) ---
276
- { class: 'bg-primary', expected: { 'background-color': '#007bff' }, variants: ['base', 'hover', 'focus', 'sm'] },
279
+ { class: 'bg-primary', expected: { 'background-color': '#007bff' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
277
280
 
278
281
  // --- DYNAMIC UTILITIES (BORDER) ---
279
- { class: 'border-primary', expected: { 'border-color': '#007bff' }, variants: ['base', 'hover', 'focus', 'sm'] },
280
- { class: 'border-2', expected: { 'border-width': '2px' }, variants: ['base', 'hover', 'focus', 'sm'] },
281
- { class: 'rounded-md', expected: { 'border-radius': '0.375rem' }, variants: ['base', 'hover', 'focus', 'sm'] },
282
+ { class: 'border-primary', expected: { 'border-color': '#007bff' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
283
+ { class: 'border-2', expected: { 'border-width': '2px' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
284
+ { class: 'rounded-md', expected: { 'border-radius': '0.375rem' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
282
285
 
283
- { class: 'ring-2', expected: { 'box-shadow': 'var(--is-ring-inset, ) 0 0 0 2px var(--is-ring-color, #3b82f6)' }, variants: ['base', 'hover', 'focus', 'sm'] },
284
- { class: 'outline-2', expected: { 'outline-width': '2px' }, variants: ['base', 'hover', 'focus', 'sm'] },
286
+ { class: 'ring-2', expected: { 'box-shadow': 'var(--is-ring-inset, ) 0 0 0 2px var(--is-ring-color, #3b82f6)' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
287
+ { class: 'outline-2', expected: { 'outline-width': '2px' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
285
288
 
286
289
  // --- DYNAMIC UTILITIES (EFFECTS) ---
287
- { class: 'opacity-50', expected: { 'opacity': '0.5' }, variants: ['base', 'hover', 'focus', 'sm'] },
288
- { class: 'z-10', expected: { 'z-index': '10' }, variants: ['base', 'hover', 'focus', 'sm'] },
289
- { class: 'shadow-sm', expected: { 'box-shadow': '0 1px 2px 0 var(--is-shadow-color, rgba(0, 0, 0, 0.05))' }, variants: ['base', 'hover', 'focus', 'sm'] },
290
+ { class: 'opacity-50', expected: { 'opacity': '0.5' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
291
+ { class: 'z-10', expected: { 'z-index': '10' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
292
+ { class: 'shadow-sm', expected: { 'box-shadow': '0 1px 2px 0 var(--is-shadow-color, rgba(0, 0, 0, 0.05))' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
290
293
 
291
294
  // --- DYNAMIC UTILITIES (TRANSFORM) ---
292
- { class: 'scale-50', expected: { 'transform': 'scale(0.5)' }, variants: ['base', 'hover', 'focus', 'sm'] },
293
- { class: 'rotate-45', expected: { 'transform': 'rotate(45deg)' }, variants: ['base', 'hover', 'focus', 'sm'] },
294
- { class: 'skew-x-6', expected: { 'transform': 'skewX(6deg)' }, variants: ['base', 'hover', 'focus', 'sm'] },
295
- { class: 'translate-x-4', expected: { 'transform': 'translateX(1rem)' }, variants: ['base', 'hover', 'focus', 'sm'] },
295
+ { class: 'scale-50', expected: { 'transform': 'scale(0.5)' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
296
+ { class: 'rotate-45', expected: { 'transform': 'rotate(45deg)' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
297
+ { class: 'skew-x-6', expected: { 'transform': 'skewX(6deg)' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
298
+ { class: 'translate-x-4', expected: { 'transform': 'translateX(1rem)' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
296
299
 
297
300
  // --- DYNAMIC UTILITIES (TRANSITION) ---
298
- { class: 'duration-300', expected: { 'transition-duration': '300ms' }, variants: ['base', 'hover', 'focus', 'sm'] },
299
- { class: 'delay-100', expected: { 'transition-delay': '100ms' }, variants: ['base', 'hover', 'focus', 'sm'] },
300
- { class: 'ease-in', expected: { 'transition-timing-function': 'cubic-bezier(0.4, 0, 1, 1)' }, variants: ['base', 'hover', 'focus', 'sm'] },
301
+ { class: 'duration-300', expected: { 'transition-duration': '300ms' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
302
+ { class: 'delay-100', expected: { 'transition-delay': '100ms' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
303
+ { class: 'ease-in', expected: { 'transition-timing-function': 'cubic-bezier(0.4, 0, 1, 1)' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
301
304
 
302
305
  // --- DYNAMIC ARBITRARY ---
303
- { class: 'p-[17px]', expected: { 'padding': '17px' }, variants: ['base', 'hover', 'focus', 'sm'] },
304
- { class: 'w-[33.3%]', expected: { 'width': '33.3%' }, variants: ['base', 'hover', 'focus', 'sm'] },
305
- { class: 'm-[100px]', expected: { 'margin': '100px' }, variants: ['base', 'hover', 'focus', 'sm'] },
306
+ { class: 'p-[17px]', expected: { 'padding': '17px' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
307
+ { class: 'w-[33.3%]', expected: { 'width': '33.3%' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
308
+ { class: 'm-[100px]', expected: { 'margin': '100px' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
306
309
 
307
310
  // --- BORDER SPACING ---
308
- { class: 'border-spacing-2', expected: { 'border-spacing': 'var(--is-border-spacing-x) var(--is-border-spacing-y)' }, variants: ['base', 'hover', 'focus', 'sm'] },
311
+ { class: 'border-spacing-2', expected: { 'border-spacing': 'var(--is-border-spacing-x) var(--is-border-spacing-y)' }, variants: ['base', 'hover', 'focus', 'placeholder', 'sm'] },
309
312
  ];
310
313
 
311
314
  testCases.forEach(test => {