emily-css 1.2.7 → 1.2.9
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 +45 -1
- package/README.md +18 -0
- package/package.json +1 -1
- package/src/generators/background.js +11 -0
- package/src/generators/display.js +2 -0
- package/src/generators/effects.js +2 -0
- package/src/generators/overflow.js +9 -0
- package/src/generators/positioning.js +14 -0
- package/src/generators/sizing.js +1 -0
- package/src/generators/transforms.js +7 -1
- package/src/index.js +1890 -1849
- package/src/init.js +1011 -812
- package/src/migrate.js +6 -0
- package/src/purge.js +8 -0
- package/src/purgeConfig.js +9 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,50 @@ All notable changes to `emily-css` are documented here.
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## v1.2.9 — May 2026
|
|
8
|
+
|
|
9
|
+
**Fix baseFontSize handling in emily-css init and generated CSS**
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
- fix(init): persist baseFontSize and emit html font-size for non-default values
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
## v1.2.8 — May 2026
|
|
16
|
+
|
|
17
|
+
**feat(purge): add purge safelist support and keep semantic dark/light utilities**
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
- feat(purge): add purge safelist support and keep semantic dark/light utilities
|
|
21
|
+
- add purge safelist support and keep semantic dark/light utilities
|
|
22
|
+
- widen utility-prefix detection for scanner
|
|
23
|
+
- expand Tailwind-compatible utility coverage
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
- add coverage for new utility classes
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
## v1.2.8 — May 2026
|
|
30
|
+
|
|
31
|
+
**Expand Tailwind-compat utility coverage and align migration scanner utility-family detection.**
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
- utilities: negative margin set (`-m-*`, `-mx-*`, `-my-*`, `-mt-*`, `-mr-*`, `-mb-*`, `-ml-*`)
|
|
35
|
+
- utilities: full positioning values (`top/right/bottom/left/inset(-x/-y)-full`)
|
|
36
|
+
- utilities: `box-border`, `box-content`
|
|
37
|
+
- utilities: `justify-items-*`, `justify-self-*`
|
|
38
|
+
- utilities: `max-h-none`
|
|
39
|
+
- utilities: font weight completion (`font-thin`, `font-extralight`, `font-extrabold`, `font-black`)
|
|
40
|
+
- utilities: `bg-origin-*` and `bg-gradient-to-*`
|
|
41
|
+
- utilities: `transition-all`, `transition-shadow`
|
|
42
|
+
- utilities: `scale-x-*`, `scale-y-*`, expanded skew and negative skew variants
|
|
43
|
+
- utilities: full overscroll set (`overscroll-*`, `overscroll-x-*`, `overscroll-y-*`)
|
|
44
|
+
|
|
45
|
+
### Changed
|
|
46
|
+
- migrate: expanded utility-prefix detection to include `box-*`, `overscroll-*`, `transition-*`, `color-scheme-*`, `field-sizing-*`, and `scrollbar-*` families.
|
|
47
|
+
- docs: updated README and migrate documentation with new compatibility coverage.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
7
51
|
## v1.2.7 — May 2026
|
|
8
52
|
|
|
9
53
|
**Fix migration scanner filtering so Vue dynamic class placeholders such as [rootClass] are not reported as unsupported arbitrary value utilities.**
|
|
@@ -463,4 +507,4 @@ All notable changes to `emily-css` are documented here.
|
|
|
463
507
|
- 11,844 utility classes generated from `emily.config.json`
|
|
464
508
|
- OKLCH colour scale generation — one hex in, 10-shade scale out
|
|
465
509
|
- Responsive variants (`sm:` `md:` `lg:` `xl:` `2xl:`)
|
|
466
|
-
- State variants (`hover:` `focus-visible:` `active:` `disab
|
|
510
|
+
- State variants (`hover:` `focus-visible:` `active:` `disab
|
package/README.md
CHANGED
|
@@ -11,6 +11,7 @@ emilyCSS lets you define design tokens in `emily.config.json` and generate stati
|
|
|
11
11
|
- Token-first utility generation from your own colours, spacing, typography, and motion settings
|
|
12
12
|
- Framework-agnostic output (`dist/emily.css` and `dist/emily.min.css`)
|
|
13
13
|
- Accessibility-focused utility coverage (focus rings, visually-hidden helpers, motion-aware variants)
|
|
14
|
+
- Broader Tailwind-style compatibility coverage for everyday migration classes
|
|
14
15
|
- Tooling support with manifest and IntelliSense JSON generation
|
|
15
16
|
- CommonJS package with Node 18+ compatibility
|
|
16
17
|
|
|
@@ -67,6 +68,23 @@ npm run emily:help
|
|
|
67
68
|
- `migrate` is report-only and helps plan Tailwind-to-Emily migrations without modifying files.
|
|
68
69
|
- For best migrate accuracy, generate the full framework/manifest first (`emily-css build --keep-full` or enable `manifest: true`).
|
|
69
70
|
|
|
71
|
+
## Tailwind compatibility additions
|
|
72
|
+
|
|
73
|
+
Recent utility coverage additions include:
|
|
74
|
+
|
|
75
|
+
- Negative margin utilities: `-m-*`, `-mx-*`, `-my-*`, `-mt-*`, `-mr-*`, `-mb-*`, `-ml-*`
|
|
76
|
+
- Positioning full values: `top-full`, `right-full`, `bottom-full`, `left-full`, `inset-full`, `inset-x-full`, `inset-y-full`
|
|
77
|
+
- Box sizing: `box-border`, `box-content`
|
|
78
|
+
- Grid alignment: `justify-items-*`, `justify-self-*`
|
|
79
|
+
- Sizing completion: `max-h-none`
|
|
80
|
+
- Typography completion: `font-thin`, `font-extralight`, `font-extrabold`, `font-black`
|
|
81
|
+
- Background origin and gradient directions: `bg-origin-*`, `bg-gradient-to-*`
|
|
82
|
+
- Transition completion: `transition-all`, `transition-shadow`
|
|
83
|
+
- Transform axis utilities: `scale-x-*`, `scale-y-*`, extended `skew-x-*`, `skew-y-*`, and negative skew variants
|
|
84
|
+
- Overscroll behavior: `overscroll-*`, `overscroll-x-*`, `overscroll-y-*`
|
|
85
|
+
|
|
86
|
+
Migration scanner utility-prefix detection was also expanded for classes like `box-*`, `overscroll-*`, `transition-*`, `color-scheme-*`, `field-sizing-*`, and `scrollbar-*`.
|
|
87
|
+
|
|
70
88
|
## Manifest and IntelliSense JSON
|
|
71
89
|
|
|
72
90
|
Enable machine-readable outputs when needed:
|
package/package.json
CHANGED
|
@@ -9,6 +9,9 @@ function backgroundUtilities() {
|
|
|
9
9
|
.bg-clip-padding { background-clip: padding-box; }
|
|
10
10
|
.bg-clip-content { background-clip: content-box; }
|
|
11
11
|
.bg-clip-text { -webkit-background-clip: text; background-clip: text; }
|
|
12
|
+
.bg-origin-border { background-origin: border-box; }
|
|
13
|
+
.bg-origin-padding { background-origin: padding-box; }
|
|
14
|
+
.bg-origin-content { background-origin: content-box; }
|
|
12
15
|
.bg-repeat { background-repeat: repeat; }
|
|
13
16
|
.bg-no-repeat { background-repeat: no-repeat; }
|
|
14
17
|
.bg-repeat-x { background-repeat: repeat-x; }
|
|
@@ -27,6 +30,14 @@ function backgroundUtilities() {
|
|
|
27
30
|
.bg-left-bottom { background-position: left bottom; }
|
|
28
31
|
.bg-right-top { background-position: right top; }
|
|
29
32
|
.bg-right-bottom { background-position: right bottom; }
|
|
33
|
+
.bg-gradient-to-t { background-image: linear-gradient(to top, var(--tw-gradient-stops)); }
|
|
34
|
+
.bg-gradient-to-tr { background-image: linear-gradient(to top right, var(--tw-gradient-stops)); }
|
|
35
|
+
.bg-gradient-to-r { background-image: linear-gradient(to right, var(--tw-gradient-stops)); }
|
|
36
|
+
.bg-gradient-to-br { background-image: linear-gradient(to bottom right, var(--tw-gradient-stops)); }
|
|
37
|
+
.bg-gradient-to-b { background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); }
|
|
38
|
+
.bg-gradient-to-bl { background-image: linear-gradient(to bottom left, var(--tw-gradient-stops)); }
|
|
39
|
+
.bg-gradient-to-l { background-image: linear-gradient(to left, var(--tw-gradient-stops)); }
|
|
40
|
+
.bg-gradient-to-tl { background-image: linear-gradient(to top left, var(--tw-gradient-stops)); }
|
|
30
41
|
|
|
31
42
|
`;
|
|
32
43
|
}
|
|
@@ -16,8 +16,10 @@ function transitionUtilities() {
|
|
|
16
16
|
return `/* Transitions */
|
|
17
17
|
.transition { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
|
|
18
18
|
.transition-none { transition-property: none; }
|
|
19
|
+
.transition-all { transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
|
|
19
20
|
.transition-colors { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
|
|
20
21
|
.transition-opacity { transition-property: opacity; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
|
|
22
|
+
.transition-shadow { transition-property: box-shadow; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
|
|
21
23
|
.transition-transform { transition-property: transform; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
|
|
22
24
|
.duration-75 { transition-duration: 75ms; }
|
|
23
25
|
.duration-100 { transition-duration: 100ms; }
|
|
@@ -17,6 +17,15 @@ function overflowUtilities() {
|
|
|
17
17
|
.overflow-y-clip { overflow-y: clip; }
|
|
18
18
|
.overflow-y-visible { overflow-y: visible; }
|
|
19
19
|
.overflow-y-scroll { overflow-y: scroll; }
|
|
20
|
+
.overscroll-auto { overscroll-behavior: auto; }
|
|
21
|
+
.overscroll-contain { overscroll-behavior: contain; }
|
|
22
|
+
.overscroll-none { overscroll-behavior: none; }
|
|
23
|
+
.overscroll-x-auto { overscroll-behavior-x: auto; }
|
|
24
|
+
.overscroll-x-contain { overscroll-behavior-x: contain; }
|
|
25
|
+
.overscroll-x-none { overscroll-behavior-x: none; }
|
|
26
|
+
.overscroll-y-auto { overscroll-behavior-y: auto; }
|
|
27
|
+
.overscroll-y-contain { overscroll-behavior-y: contain; }
|
|
28
|
+
.overscroll-y-none { overscroll-behavior-y: none; }
|
|
20
29
|
.truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
21
30
|
.text-ellipsis { text-overflow: ellipsis; }
|
|
22
31
|
.text-clip { text-overflow: clip; }
|
|
@@ -36,6 +36,20 @@ function positioningUtilities(spacing) {
|
|
|
36
36
|
css += `.inset-auto { inset: auto; }\n`;
|
|
37
37
|
css += `.inset-x-auto { left: auto; right: auto; }\n`;
|
|
38
38
|
css += `.inset-y-auto { top: auto; bottom: auto; }\n`;
|
|
39
|
+
css += `.inset-full { inset: 100%; }\n`;
|
|
40
|
+
css += `.inset-x-full { left: 100%; right: 100%; }\n`;
|
|
41
|
+
css += `.inset-y-full { top: 100%; bottom: 100%; }\n`;
|
|
42
|
+
css += `.top-full { top: 100%; }\n`;
|
|
43
|
+
css += `.right-full { right: 100%; }\n`;
|
|
44
|
+
css += `.bottom-full { bottom: 100%; }\n`;
|
|
45
|
+
css += `.left-full { left: 100%; }\n`;
|
|
46
|
+
css += `.-inset-full { inset: -100%; }\n`;
|
|
47
|
+
css += `.-inset-x-full { left: -100%; right: -100%; }\n`;
|
|
48
|
+
css += `.-inset-y-full { top: -100%; bottom: -100%; }\n`;
|
|
49
|
+
css += `.-top-full { top: -100%; }\n`;
|
|
50
|
+
css += `.-right-full { right: -100%; }\n`;
|
|
51
|
+
css += `.-bottom-full { bottom: -100%; }\n`;
|
|
52
|
+
css += `.-left-full { left: -100%; }\n`;
|
|
39
53
|
css += `.top-auto { top: auto; }\n`;
|
|
40
54
|
css += `.right-auto { right: auto; }\n`;
|
|
41
55
|
css += `.bottom-auto { bottom: auto; }\n`;
|
package/src/generators/sizing.js
CHANGED
|
@@ -75,6 +75,7 @@ function sizingUtilities(spacing) {
|
|
|
75
75
|
css += `.max-w-max { max-width: max-content; }\n`;
|
|
76
76
|
css += `.max-w-fit { max-width: fit-content; }\n`;
|
|
77
77
|
css += `.max-h-0 { max-height: 0; }\n`;
|
|
78
|
+
css += `.max-h-none { max-height: none; }\n`;
|
|
78
79
|
css += `.max-h-full { max-height: 100%; }\n`;
|
|
79
80
|
css += `.max-h-screen { max-height: 100vh; }\n`;
|
|
80
81
|
css += `.max-h-svh { max-height: 100svh; }\n`;
|
|
@@ -32,13 +32,19 @@ function transformUtilities(spacing) {
|
|
|
32
32
|
const scales = [0, 50, 75, 90, 95, 100, 110, 125, 150];
|
|
33
33
|
scales.forEach(scale => {
|
|
34
34
|
css += `.scale-${scale} { --scale-x: ${scale / 100}; --scale-y: ${scale / 100}; transform: ${composedTransform}; }\n`;
|
|
35
|
+
css += `.scale-x-${scale} { --scale-x: ${scale / 100}; transform: ${composedTransform}; }\n`;
|
|
36
|
+
css += `.scale-y-${scale} { --scale-y: ${scale / 100}; transform: ${composedTransform}; }\n`;
|
|
35
37
|
});
|
|
36
38
|
|
|
37
39
|
// Skew
|
|
38
|
-
const skews = [0, 1, 2, 3];
|
|
40
|
+
const skews = [0, 1, 2, 3, 6, 12];
|
|
39
41
|
skews.forEach(sk => {
|
|
40
42
|
css += `.skew-x-${sk} { --skew-x: ${sk}deg; transform: ${composedTransform}; }\n`;
|
|
41
43
|
css += `.skew-y-${sk} { --skew-y: ${sk}deg; transform: ${composedTransform}; }\n`;
|
|
44
|
+
if (sk > 0) {
|
|
45
|
+
css += `.-skew-x-${sk} { --skew-x: -${sk}deg; transform: ${composedTransform}; }\n`;
|
|
46
|
+
css += `.-skew-y-${sk} { --skew-y: -${sk}deg; transform: ${composedTransform}; }\n`;
|
|
47
|
+
}
|
|
42
48
|
});
|
|
43
49
|
|
|
44
50
|
// Transform origin
|