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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "emily-css",
3
- "version": "1.2.7",
3
+ "version": "1.2.9",
4
4
  "description": "A config-driven utility CSS framework. Define your brand once, generate the CSS.",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -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
  }
@@ -37,6 +37,8 @@ function displayUtilities() {
37
37
  .clear-right { clear: right; }
38
38
  .clear-both { clear: both; }
39
39
  .clear-none { clear: none; }
40
+ .box-border { box-sizing: border-box; }
41
+ .box-content { box-sizing: content-box; }
40
42
 
41
43
  `;
42
44
  }
@@ -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`;
@@ -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